Multiply集合并随机与其他人合并--Apache Spark

时间:2015-05-23 20:29:12

标签: algorithm scala apache-spark

我获得了两个馆藏(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中的值不能在样本中重复。

我想不出任何有效的方法。

1 个答案:

答案 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)))