统计不同省份的商品点击排行(两种实现方式)

需求: 统计不同省份的商品点击排行

 //数据
    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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值