1. 程式人生 > >使用Spark進行搜狗日誌分析實例——列出搜索不同關鍵詞超過10個的用戶及其搜索的關鍵詞

使用Spark進行搜狗日誌分析實例——列出搜索不同關鍵詞超過10個的用戶及其搜索的關鍵詞

log collect pre form 用戶 path space img ack

 1 package sogolog
 2 
 3 import org.apache.hadoop.io.{LongWritable, Text}
 4 import org.apache.hadoop.mapred.TextInputFormat
 5 import org.apache.spark.rdd.RDD
 6 import org.apache.spark.{SparkConf, SparkContext}
 7 
 8 
 9 
10 class RddFile {
11   def readFileToRdd(path: String): RDD[String] = {
12
val conf = new SparkConf().setMaster("local").setAppName("sougoDemo") 13 val sc = new SparkContext(conf); 14 //使用這種方法能夠避免中文亂碼 15 sc.hadoopFile("J:\\scala\\workspace\\first-spark-demo\\sougofile\\SogouQ.reduced",classOf[TextInputFormat], classOf[LongWritable], classOf[Text]).map{ 16 pair => new
String(pair._2.getBytes, 0, pair._2.getLength, "GBK")} 17 } 18 }

 1 package sogolog
 2 
 3 import org.apache.spark.rdd.RDD
 4 
 5 /**
 6   * 列出搜索不同關鍵詞超過3個的用戶及其搜索的關鍵詞
 7   */
 8 object userSearchKeyWordLT3 {
 9   def main(args: Array[String]): Unit = {
10     //1、讀入文件
11     val textFile = new RddFile().readFileToRdd("J:\\scala\\workspace\\first-spark-demo\\sougofile\\SogouQ.reduced")
12 13 //2、map操作,將每行的用戶、關鍵詞讀入新的RDD中 14 val userKeyWordTuple:RDD[(String,String)] = textFile.map(line=>{ 15 val arr = line.split("\t") 16 (arr(1),arr(2)) 17 }) 18 19 //3、reduce操作,將相同用戶的關鍵詞進行合並 20 val userKeyWordReduced = userKeyWordTuple.reduceByKey((x,y)=>{ 21 //去重 22 if(x.contains(y)){ 23 x 24 }else{ 25 x+","+y 26 } 27 }) 28 29 //4、使用filter進行最終過濾 30 val finalResult = userKeyWordReduced.filter(x=>{ 31 //過濾小於10個關鍵詞的用戶 32 x._2.split(",").length>=10 33 }) 34 35 //5、打印出結果 36 finalResult.collect().foreach(println) 37 } 38 }

運行結果:

技術分享圖片

使用Spark進行搜狗日誌分析實例——列出搜索不同關鍵詞超過10個的用戶及其搜索的關鍵詞