输入数据来源, 用户查询日志(SogouQ), 感谢搜狗实验室! 此次选择的是精简版(一天数据, 63MB, 解压后145MB),
PS1: 日志原格式是GB2312编码, 一定要记得转成UTF-8
PS2: 日志格式和格式说明: // 搜狗实验室的官方说明
访问时间\t用户ID\t[查询词]\t该URL在返回结果中的排名\t用户点击的顺序号\t用户点击的URL,
这个格式有坑, 深坑:
"该URL在返回结果中的排名\t用户点击的顺序号"这两个字段之间的分割符并不是制表符\t, 而是空格
val sogouQRdd = sc.textFile("hdfs://node1:9000/sogouQ/input") sogouQRdd.cache # 在下一次Action操作时, 将日志文件缓存到内存中
实现普通的 WordCount, 但结果不会像 MapReduce 那样按 Key(word) 排序
sogouQRdd.filter(_.split('\t').length == 5): 有两个搜索关键字的字符串(为什么只是两个,别问我是怎么知道的), 居然有制表符\t, 一定要记得过滤掉
val wcWithoutSortRdd = sogouQRdd.filter(_.split('\t').length == 5).map(_.split('\t')(2)).map((_,1)).reduceByKey(_+_) wcWithoutSortRdd.saveAsTextFile("hdfs://node1:9000/sogouQ/output/wc1")
wcWithoutSortRdd的输出结果Top10
([中天ZT1818评论+site:www.pcpop.com|product.pcpop.com|channel.pcpop.com|pop.pcpop.com],1) ([三一重工+筑路机械],1) ([最快的视频网站],1) ([zhutan],3) ([氟康],3) ([石家庄战役],2) ([国外女子监狱],1) ([A42B331参数],1) ([78bar],1) ([临沂麦可斯],2)
实现按 Value(count) 排序(降序)的 WordCount
思路: 在 wcRdd 的基础上, 先把K(word), V(count)反转, 此时对Key(count)进行排序, 最后再反转回去
val wcSortByCountRdd = wcWithoutSortRdd.map(x => (x._2,x._1)).sortByKey(false).map(x => (x._2,x._1)) wcSortByCountRdd.saveAsTextFile("hdfs://node1:9000/sogouQ/output/wc2")
wcSortByCountRdd的输出结果Top10
([哄抢救灾物资],66906) ([汶川地震原因],58766) ([封杀莎朗斯通],12649) ([一个暗娼的自述],9758) ([广州军区司令员],8661) ([暗娼李湘],8584) ([成都警方扫黄现场],5371) ([百度],4958) // 用搜狗搜百度, 好像在黑百度, 嘿嘿嘿 ([尼泊尔地图],4886) ([现役解放军中将名单],4721)
再次感谢搜狗实验室! 希望有更多的日志文件公布