如何替换RDD 2中每个键的RDD 1中的值?

S.K*_*ang 5 scala apache-spark

这是两个RDD。

表1对(键,值)

val table1 = sc.parallelize(Seq(("1", "a"), ("2", "b"), ("3", "c")))  
//RDD[(String, String)]
Run Code Online (Sandbox Code Playgroud)

表2-数组

val table2 = sc.parallelize(Array(Array("1", "2", "d"), Array("1", "3", "e")))  
//RDD[Array[String]]
Run Code Online (Sandbox Code Playgroud)

我试图使用table1中的键和值将table2的元素(例如,“ 1”)更改为“ a”。我的预期结果如下:

RDD[Array[String]] = (Array(Array("a", "b", "d"), Array("a", "c", "e")))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

有没有办法使之成为可能?

如果是这样,使用庞大的数据集会更有效吗?

Jac*_*ski 1

有没有办法让这成为可能?

是的。使用数据集(不是 RDD,因为效率和表达力较差),将join它们组合在一起并使用select您喜欢的字段。

val table1 = Seq(("1", "a"), ("2", "b"), ("3", "c")).toDF("key", "value")
scala> table1.show
+---+-----+
|key|value|
+---+-----+
|  1|    a|
|  2|    b|
|  3|    c|
+---+-----+

val table2 = sc.parallelize(
  Array(Array("1", "2", "d"), Array("1", "3", "e"))).
  toDF("a").
  select($"a"(0) as "a0", $"a"(1) as "a1", $"a"(2) as "a2")
scala> table2.show
+---+---+---+
| a0| a1| a2|
+---+---+---+
|  1|  2|  d|
|  1|  3|  e|
+---+---+---+

scala> table2.join(table1, $"key" === $"a0").select($"value" as "a0", $"a1", $"a2").show
+---+---+---+
| a0| a1| a2|
+---+---+---+
|  a|  2|  d|
|  a|  3|  e|
+---+---+---+
Run Code Online (Sandbox Code Playgroud)

对其他a列重复此操作并union一起进行。重复代码时,您会注意到使代码通用的模式。

如果是这样,使用庞大的数据集会有效吗?

是的(再次)。我们这里讨论的是 Spark,庞大的数据集正是您选择 Spark 的原因,不是吗?