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)