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

在Spark中,由于RDD的惰性计算(lazy)机制,转换操作(transformation)不会立即执行,只有遇到行动操作(action)时才会触发。这可能导致意外的重复计算或结果错误。例如,当使用相同的数组生成多个RDD并进行拼接时,如果数组内容在转换过程中变化,结果可能不正确。为避免这种情况,可以适时使用count或cache等行动操作强制执行转换,确保数据的一致性。
摘要由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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值