最近通过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.un

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

被折叠的 条评论
为什么被折叠?



