需求: 统计不同省份的商品点击排行
//数据
val srcDatas = List(
("zhangsan", "河北", "鞋"),
("lisi", "河北", "衣服"),
("wangwu", "河北", "鞋"),
("zhangsan", "河南", "鞋"),
("lisi", "河南", "衣服"),
("wangwu", "河南", "鞋"),
("zhangsan", "河南", "鞋"),
("lisi", "河北", "衣服"),
("wangwu", "河北", "鞋"),
("zhangsan", "河北", "鞋"),
("lisi", "河北", "衣服"),
("wangwu", "河北", "帽子"),
("zhangsan", "河南", "鞋"),
("lisi", "河南", "衣服"),
("wangwu", "河南", "帽子"),
("zhangsan", "河南", "鞋"),
("lisi", "河北", "衣服"),
("wangwu", "河北", "帽子"),
("lisi", "河北", "衣服"),
("wangwu", "河北", "电脑"),
("zhangsan", "河南", "鞋"),
("lisi", "河南", "衣服"),
("wangwu", "河南", "电脑"),
("zhangsan", "河南", "电脑"),
("lisi", "河北", "衣服"),
("wangwu", "河北", "帽子")
)
解法一:
//第一步:清洗数据 (只要 省份,商品名)
val tuples = srcDatas.map(r => (r._2, r._3))
println(tuples) //结果:List((河北,鞋), (河北,衣服), (河北,鞋), (河北,衣服)...... (河北,帽子))
//第二步:按照 省份,商品分组
val functionToMap = tuples.groupBy(r => r)
println(functionToMap) //结果:Map((河北,衣服) -> List((河北,衣服), (河北,衣服), (河北,衣服), (河北,衣服), (河北,衣服), (河北,衣服)),... ...)
//第三步:统计每个省份的商品,点击次数
val tupleToInt = functionToMap.mapValues(r => r.length)
println(tupleToInt); //结果:Map((河北,衣服) -> 6, (河南,鞋) -> 6, (河南,电脑) -> 2, (河北,鞋) -> 4, (河南,帽子) -> 1, (河北,帽子) -> 3, (河北,电脑) -> 1, (河南,衣服) -> 3)
//第四步:按省份分组
val stringToMap = tupleToInt.groupBy(r => r._1._1)
println(stringToMap)
//结果:Map(河南 -> Map((河南,鞋) -> 6, (河南,电脑) -> 2, (河南,帽子) -> 1, (河南,衣服) -> 3), 河北 -> Map((河北,衣服) -> 6, (河北,鞋) -> 4, (河北,帽子) -> 3, (河北,电脑) -> 1))
//第五步:将每个省份的商品,点击次数提取出来
val stringToStringToInt = stringToMap.map(kv => (kv._1, kv._2.map(r => (r._1._2, r._2)))) //解释 kv._2 对应的是:(河南,鞋) -> 6, (河南,电脑) -> 2, (河南,帽子) -> 1, (河南,衣服) -> 3
println(stringToStringToInt)
//结果:Map(河南 -> Map(鞋 -> 6, 电脑 -> 2, 帽子 -> 1, 衣服 -> 3), 河北 -> Map(衣服 -> 6, 鞋 -> 4, 帽子 -> 3, 电脑 -> 1))
解法二:使用模式匹配
// 第一步:数据清洗
val tuples = srcDatas.map {
case (n, p, g) => (p, g)
}
println(tuples)
// 第二步:按省份,商品分组
val tupleToTuples = tuples.groupBy {
case (p, g) => (p, g)
}
println(tupleToTuples)
// 第三步:统计每个省份的每种商品点击量
val tupleToInt = tupleToTuples.map {
case (p, g) => (p, g.length)
}
println(tupleToInt)
// 第四步:按省份分组
val tupleToTupleToInt = tupleToInt.groupBy {
case ((p, g), c) => p
}
println(tupleToTupleToInt)
// 第五步:构造数据
val map = tupleToTupleToInt.map {
case (p, t) => (p, t.map(r => (r._1._2, r._2)))
}
println(map)