用戶查詢日誌(SogouQ)之查詢詞WordCount

輸入數據來源, 用戶查詢日誌(SogouQ), 感謝搜狗實驗室! 這次選擇的是精簡版(一天數據, 63MB, 解壓後145MB), html


PS1: 日誌原格式是GB2312編碼, 必定要記得轉成UTF-8java

PS2: 日誌格式和格式說明:    // 搜狗實驗室的官方說明node

訪問時間\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) 排序spa


sogouQRdd.filter(_.split('\t').length == 5): 有兩個搜索關鍵字的字符串(爲何只是兩個,別問我是怎麼知道的), 竟然有製表符\t, 必定要記得過濾掉scala

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) 排序(降序)的 WordCountcode


思路: 在 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")


思路2: 直接使用 sortBy() 操做

// _._2 : 元組的第2項, 就是 count; false : 按降序排序
val wcSortByCountRdd = wcWithoutSortRdd.sortBy(_._2, false)

wcSortByCountRdd.saveAsTextFile("hdfs://node1:9000/sogouQ/output/wc2")


wcSortByCountRdd的輸出結果Top10

([哄搶救災物資],66906)
([汶川地震緣由],58766)
([封殺莎朗斯通],12649)
([一個暗娼的自述],9758)
([廣州軍區司令員],8661)
([暗娼李湘],8584)
([成都警方掃黃現場],5371)
([百度],4958)    // 用搜狗搜百度, 好像在黑百度, 嘿嘿嘿
([尼泊爾地圖],4886)
([現役解放軍中將名單],4721)


再次感謝搜狗實驗室! 但願有更多的日誌文件公佈

相關文章
相關標籤/搜索