使用spark分析sogou日誌
下載用戶查詢日誌的精簡版,完整版http://download.labs.sogou.com/dl/q.html
數據格式說明:
訪問時間\t用戶ID\t[查詢詞]\t該URL在返回結果中的排名\t用戶點擊的順序號\t用戶點擊的URL
其中,用戶ID是根據用戶使用瀏覽器訪問搜索引擎時的Cookie信息自動賦值,即同一次使用瀏覽器輸入的不同查詢對應同一個用戶ID。實現以下功能:
1、最熱門的查詢詞排行 top10
2、用戶查詢排行 top10
3、網站訪問排行版(不用區分二級域名) top50
這從我們下載下來的文件存在hdfs中,關於hadoop的安裝,我參考了http://blog.csdn.net/stark_summer/article/details/4242427,這篇博客。
由於下載下來的文件格式是GBK的,上傳都hdfs上之前需要轉碼一下。
find *.txt -exec sh -c "iconv -f GB18030 -t UTF8 {} > {}.txt" \;
然後把下載的文件上傳到hdfs
hadoop fs -mkdir /data
hadoop fs -put /root/dfs/SogouQ.reduced /data/sogou
接下來,我們就可以寫spark程序來實現以上的問題
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
object WebLogInfo {
def main(args: Array[String]) {
val dataFile = "hdfs://vs1:9000/data/sogou/SogouQ.reduced"
val resultFile = "hdfs://vs1:9000/data/result"
val conf = new SparkConf().setAppName("WebLogInfoApp")
val sc = new SparkContext(conf)
val linesRdd = sc.textFile(dataFile).map(line => line.split('\t')).filter(_.length >= 5)
val userArray = linesRdd.map(w => (w(1), 1)).reduceByKey(_+_).map(x => (x._2, x._1)).sortByKey(false).take(10)
val userRdd = sc.parallelize(userArray, 1).map(x => (x._2, x._1))
val wordArray = linesRdd.map(w => (w(2), 1)).reduceByKey(_+_).map(x => (x._2, x._1)).sortByKey(false).take(10)
val wordRdd = sc.parallelize(wordArray, 1).map(x => (x._2, x._1))
val urlArray = linesRdd.map(w => (w(4).split('/')(0), 1)).reduceByKey(_+_).map(x => (x._2, x._1)).sortByKey(false).take(50)
val urlRdd = sc.parallelize(urlArray, 1).map(x => (x._2, x._1))
(userRdd ++ wordRdd ++ urlRdd).repartition(1).saveAsTextFile(resultFile)
sc.stop()
}
}
把代碼打成jar上傳到spark集羣就可算出結果