问题描述
问题
根据用户上网的搜索记录对每天的热点搜索词进行统计,以了解用户所关心的热点话题。
要求完成
统计每天搜索数量前3名的搜索词(同一天中同一用户多次搜索同一个搜索词视为1次)。
相关代码
#读取数据文件
val rdd = sc.textFile("file:///export/data/keywords.txt")
#查看数据文件
rdd.collect()
#将每行记录映射为(date, user, keyword)的元组
val mappedRDD = rdd.map { record =>
| val fields = record.split(",")
| (fields(0), fields(1), fields(2))
}
#去除重复的搜索记录,以同一天中同一用户多次搜索同一个搜索词视为1次
val distinctRDD = mappedRDD.distinct()
#对每天每个搜索词进行计数
val countRDD = distinctRDD.map(record => ((record._1, record._3), 1)).reduceByKey(_ + _)
#将结果按日期分组
val groupedRDD = countRDD.map{ case ((date, keyword), count) => (date, (keyword, count))}.groupByKey()
#取出每天搜索数量前3名的搜索词
val top3RDD = groupedRDD.mapValues{ iter => iter.toList.sortBy(-_._2).take(3) }
#将结果按日期分组
val resultByDate = top3RDD.collectAsMap()
#输出结果
resultByDate.toSeq.sortBy(_._1).foreach { case (date, keywords) =>
println(s"日期:$date")
for ((keyword, count) <- keywords) {
println(s"搜索词:$keyword,搜索次数:$count")
}
println()
| }
结果截图