Spark RDD的示例方法无法按预期工作

时间:2016-07-05 08:06:00

标签: apache-spark rdd

我正在尝试使用"示例" Spark 1.6.1上的RDD方法

scala>val nu = sc.parallelize(1 to 10)
scala>val sp =  nu.sample(true,0.2)
scala>sp.collect.foreach(println(_))

3 8

scala>val sp2 = nu.sample(true, 0.2)
scala>sp2.collect.foreach(println(_))

2 4 7 8 10

我无法理解为什么sp2包含2,4,7,8,10。 我认为应该只打印两个数字。 有什么不对吗?

3 个答案:

答案 0 :(得分:1)

阐述上一个答案:在documentation(向下滚动到sample)中提到了(强调我的):

  

分数:预期样本的大小,作为此RDD大小的一部分,无需替换:选择每个元素的概率;分数必须为[0,1],替换为:预期每个元素的选择次数;分数必须> = 0

'预期'根据具体情况可以有多种含义,但其中一个含义肯定不是“精确”,因此样本大小的确切数量会有所不同。

如果你想要绝对固定的样本大小,你可以使用takeSample方法,缺点是它返回一个数组(即不是RDD),它必须适合你的主存储器:

val nu = sc.parallelize(1 to 10)
/** set seed for reproducibility */
val sp1 = nu.takeSample(true, 2, 182453) 
sp1: Array[Int] = Array(7, 2)

val sp2 = nu.takeSample(true, 2)
sp2: Array[Int] = Array(2, 10)

val sp3 = nu.takeSample(true, 2)
sp2: Array[Int] = Array(4, 6)

答案 1 :(得分:0)

分数并不意味着给我这个元素完全。它说平均给我这么多元素,所以如果你运行几次,你会有不同数量的元素。

答案 2 :(得分:-1)

RDD上的

示例方法,

  

返回此RDD的采样子集。

返回类型为未记录,因此它可以是您的主RDD中的任何内容。