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