SparkStreaming解决数据倾斜方法

SparkStreaming解决数据倾斜方法
两阶段聚合的方式解决数据倾斜

在这里插入图片描述

解释:
对DStream 进行map操作对原始key前加上随机值,map完后进行第一次reducebykey操作,此结果为打散key后的reducebykey结果,再次进行map操作根据分隔符,去掉随机数保留原有key,map后再进行reducebykey,保证相同key的数据准确累加。

代码实现

    val dsStream=stream.filter(item => item.value().split("\t").length == 3)//过滤合格的数据
    .mapPartitions(partitions => //对所有分区的数据进行转换
        partitions.map(item => {
          val rand = new Random() //创建随机数对象
          val line = item.value() //获取value
          val arr = line.split("\t")  //切割
          val id = arr(1)       //取第二个元素
          (rand.nextInt(3) + "_" + id, 1)    //随机数与app_id进行拼接,并且返回二元组
        }))
    val result = dsStream.reduceByKey(_ + _)     //重组之后的第一次reduceByKey
    result.map(item => {                                     //进行map转换把key切割还原
      val id = item._1.split("_")(1)
      (id, item._2)
    }).reduceByKey(_ + _).print()                //还原之后进行第二次聚合

想要更多文档资料及更多大数据相关文档资料请加qq群下载:912703269

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DFZR-ZXHY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值