algorithm - 乘以集合并随机与其他集合合并 - Apache Spark

标签 algorithm scala apache-spark

我有两个集合(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/

相关文章:

python - 使用对象循环时获取 ID 字段

log4j - 如何抑制在 EMR 上运行的 spark-sql 的 INFO 消息?

apache-spark - RDD 和 Dataset 的不同默认值持续存在

apache-spark - 使用 Hadoop 以编程方式解压包含多个不相关 csv 文件的文件

algorithm - 论文 "An Image Signature for any kind of Image"中的算法背后的推理是什么?

algorithm - 加载模具算法

algorithm - 有人知道这个算法的名称是什么吗?

Scala Web 框架的安全性

Scalaz 7 Iteratee 处理大型 zip 文件(OutOfMemoryError)

scala - 如何使用scala读取RC文件