我有两个集合(RDD)。让我们说一些样本
val v = sc.parallelize(List("a", "b", "c"))
val a = sc.parallelize(List(1, 2, 3, 4, 5))
val samplesCount = 2
我想创建两个由对组成的集合(样本),其中一个值来自“v”,第二个值来自“a”。每个集合必须包含来自 v 的所有值和来自“a”的随机值。
示例结果为:
(
(("a", 3), ("b", 5), ("c", 1)),
(("a", 4), ("b", 2), ("c", 5))
)
要补充的一点是,来自 v 或 a 的值不能在样本中重复。
我想不出任何好的方法来实现这一目标。
最佳答案
您随机打乱要采样的 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)))
关于algorithm - 乘以集合并随机与其他集合合并 - Apache Spark,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30417271/