spark sample采样

def sample(withReplacement: Boolean, fraction: Double, seed: Long = Utils.random.nextLong): RDD[T]

参数解释:

1、参数withReplacement:

网上找了很多资料没有详细讲这一块,然后被他们描述的一脸懵逼,再然后不知怎么的就反应过来,这tm是大一还是大二的数学课教的概率。。

记得有个这样的问题:黑球有10个,白球有5个,然后都放在一个桶中,一共抽3次。

有两种问法:

(1)每抽一次再把球放回桶里,桶里被抽取的球的总数不变,还是15个,然后再抽,抽完再放回去,再继续抽,直到抽了3次位置。

这个就是withReplacement参数为true时的情况。

(2)每抽中一个,则把这个球放旁边去,不放回桶里,每抽一次少一个球。。直到抽了3次为止。

这个就是withReplacement参数为false时的情况。

桶里就是原来的集合,球就是集合的元素

2、fraction表示抽样比例;0~1之间的浮点数,注意,会有误差的。。比如十个元素,比例为0.1,他抽取的时候可能为0个,1个、2个(我少量数据随便跑几次就有三种可能,所以这个比例只是趋近于,而不是一定)

3、seed为随机数种子(java的random不是也有个seed么,没错,作用类似)

最后执行例子:

(1)创建RDD

scala> val rdd = sc.parallelize(1 to 10)

rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[20] at parallelize at <console>:24

(2)打印

scala> rdd.collect()

res15: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

(3)放回抽样

scala> var sample1 = rdd.sample(true,0.4,2)

sample1: org.apache.spark.rdd.RDD[Int] = PartitionwiseSampledRDD[21] at sample at <console>:26

(4)打印放回抽样结果

scala> sample1.collect()

res16: Array[Int] = Array(1, 2, 2, 7, 7, 8, 9)

(5)不放回抽样

scala> var sample2 = rdd.sample(false,0.2,3)

sample2: org.apache.spark.rdd.RDD[Int] = PartitionwiseSampledRDD[22] at sample at <console>:26

(6)打印不放回抽样结果

scala> sample2.collect()

res17: Array[Int] = Array(1, 9)

发布了144 篇原创文章 · 获赞 36 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_36951116/article/details/103372974