分析:top10热门已获取,就可以通过品类ID和sessionID来汇总一种品类商品同一session的操作次数,再对品类分区排序
思路想好直接上代码:
// 获取到top10的品类ID
val cid: List[String] = values.map(_.cid)
// 过滤数据(只留下top10)
val filterRDD: RDD[String] = rdd.filter(
line => {
val strings: Array[String] = line.split("_")
if (strings(6) != "-1") {
cid.contains(strings(6))
} else {
false
}
}
)
// 将数据转换为((cid,session),1)再进行聚合,聚合后进行转化为(cid,(session,sum))来按cid分组按sum排序取top10
filterRDD.map(
line => {
val strings: Array[String] = line.split("_")
((strings(6),strings(2)),1)
}
).reduceByKey(_+_).map {
case (k, v) => {
((k._1), (k._2, v))
}
}.groupByKey().mapValues(
iter => {
iter.toList.sortBy(_._2)(Ordering.Int.reverse).take(10)
}
).foreach(println)
这块是只针对这一需求的代码
(Ordering.Int.reverse)实现倒序