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)
有没有办法使之成为可能?
如果是这样,使用庞大的数据集会更有效吗?
有没有办法让这成为可能?
是的。使用数据集(不是 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 的原因,不是吗?