Spark的RDD连续转换操作有时需要注意强行触发action执行操作,否则(Tansformation)的惰性(lazy)机制会导致结果错误

 最近通过spark做一些数据处理,遇到一些诡异的现象我开发了一个随机生成海量数据点的程序,因为要保证这些点具有自增序号,不适合直接map分布式做(几十亿的数据,map计算需要分区(不主动分区估计也会自动分区,spark自带的数据累加逻辑只能对单个partition分区内有效),需要在driver里进行序号计算,所以就想通过数组分批生成数据,转换成RDD,在依次拼接(union)起来,就是...
摘要由CSDN通过智能技术生成

 

最近通过spark做一些数据处理,遇到一些诡异的现象

我开发了一个随机生成海量数据点的程序,因为要保证这些点具有自增序号,不适合直接map分布式做(几十亿的数据,map计算需要分区(不主动分区估计也会自动分区,spark自带的数据累加逻辑只能对单个partition分区内有效),需要在driver里进行序号计算,所以就想通过数组分批生成数据,转换成RDD,在依次拼接(union)起来,就是下面的代码。

 val array = ArrayBuffer[(String,String)]()
 var i=0l
 var rdd:RDD[(String,String)] = sc.makeRDD(array)
 
 for(i<- 1l to size)
 {
        val name = "王".toString.concat((i % 1000).toString)
        array +=((i.toString, name))
        if(i%part_size == 0)
        {
            val rdd1 = sc.makeRDD(array)
            rdd1.cache
            val pre_rdd = rdd
            rdd= rdd.union(rdd1)
            rdd.cache()
            array.clear()
            rdd1.unpersist()
            pre_rdd.unpersist()
          }

    }
    if(array.length>0)
    {
      val rdd1 = sc.parallelize(array)
      rdd1.cache
      val pre_rdd = rdd
      rdd=rdd.union(rdd1)
      rdd.cache()
      pre_rdd.unpersist()
      rdd1.unpersist()
    }

好了,经验丰富或者了解相关基础知识的同学,知道上面代码有问题后,应该很快能看出问题在哪儿了,其他人是不是看着计算逻辑挺正常?

但如果我输入size=8,part_size=5,就是输出8个点,分批计算,每批算5个点。不管分几批,对结果应该没影响,最终结果就是

(1,xxxx)(2,

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值