在做机器学习研究时,我们通常使用spark生成正负样本,如果是自己通过随机采样的方式生成负样本时,会有一个正负样本union的过程,这时候如果正负样本无法随机打散的话,可能会导致正负样本扎堆,在模型遇到正样本或者负样本之前就已经收敛了,这并不是我们所期望的,所以用spark将样本随机打散是一个非常必要的过程。

repartition是一个重分区的算子,将数据随机打散到各个分区上。repartition通常被用来实现数据的随机打散,但是它并不总是能够完全打散,这和repartition打散逻辑有关。repartition是将数据顺序均匀放在各个Partition当中,与(K,V)对的K无关。而partitionby是根据key进行打散,将key相同的数据放到同一个partition。所以可以使用partitionby将数据打散。实现如下:

1
val tfData = tfDataTmp.map(f=>(Random.nextInt(21474830), f)).partitionBy(new HashPartitioner(2000)).map(f=>f._2)

应该看下源码的,记录下。

参考: