我获得了两个馆藏(RDD)。让我们说和一些样本
string(4) "1.01"
我想创建两个由对组成的集合(样本),其中一个值来自'v',第二个来自'a'。每个集合必须包含来自v的所有值和来自“a”的随机值。
示例结果将是:
val v = sc.parallelize(List("a", "b", "c"))
val a = sc.parallelize(List(1, 2, 3, 4, 5))
val samplesCount = 2
要添加的另一个是v或a中的值不能在样本中重复。
我想不出任何有效的方法。
答案 0 :(得分:1)
随机抽取要采样的RDD,然后按行索引加入两个RDD:
def shuffle[A: reflect.ClassTag](a: RDD[A]): RDD[A] = {
val randomized = a.map(util.Random.nextInt -> _)
randomized.sortByKey().values
}
def joinLines[A: reflect.ClassTag, B](a: RDD[A], b: RDD[B]): RDD[(A, B)] = {
val aNumbered = a.zipWithIndex.map { case (x, i) => (i, x) }
val bNumbered = b.zipWithIndex.map { case (x, i) => (i, x) }
aNumbered.join(bNumbered).values
}
val v = sc.parallelize(List("a", "b", "c"))
val a = sc.parallelize(List(1, 2, 3, 4, 5))
val sampled = joinLines(v, shuffle(a))
RDD是不可变的,因此您不需要“增加”任何东西。如果您想要多个样品,请执行以下操作:
val sampledRDDs: Seq[RDD[(String, Int)]] =
(1 to samplesCount).map(_ => joinLines(v, shuffle(a)))