如何 merge/join Spark/Scala RDD to List 以便 RDD 中的每个值在每个列表项中获得一个新行

How to merge/join Spark/Scala RDD to List so each value in RDD gets a new row with each List item

假设我有一个 List[String],我想将它与一个 RDD 对象合并,以便 RDD 中的每个对象都获得添加到它的列表中的每个值:

List[String] myBands = ["Band1","Band2"]; 

Table:乐队成员 |姓名|仪器 | | ----- | ---------- | |斜杠 |吉他 | |轴 |人声 |

case class BandMembers ( name:String, instrument:String );
var myRDD = BandMembersTable.map(a => new BandMembers(a.name, a.instrument));  
//join the myRDD to myBands
// how do I do this?
//var result = myRdd.join/merge/union(myBands); 

想要的结果: |姓名|仪器 |乐队 | | ----- | ---------- |------| |斜杠 |吉他 |带1| |斜杠 |吉他 |带2| |轴 |人声 |带1| |轴 |人声 |频段 2|

我不太确定如何以最好的方式解决这个问题 Spark/Scala。我知道我可以转换为 DF,然后使用 spark sql 进行连接,但是必须有更好的方法来处理 RDD 和 List,我认为是这样。

此处的风格有点偏离,但假设您确实需要 RDD 而不是 Dataset

所以对于 RDD:

case class BandMembers ( name:String, instrument:String )
val myRDD = spark.sparkContext.parallelize(BandMembersTable.map(a => new BandMembers(a.name, a.instrument)))
val myBands = spark.sparkContext.parallelize(Seq("Band1","Band2"))
val res = myRDD.cartesian(myBands).map { case (a,b) => Row(a.name, a.instrument, b) }

使用数据集:

case class BandMembers ( name:String, instrument:String )
val myRDD = BandMembersTable.map(a => new BandMembers(a.name, a.instrument)).toDS
val myBands = Seq("Band1","Band2").toDS
val res = myRDD.crossJoin(myBands)

输入数据:

val BandMembersTable = Seq(BandMembers("a", "b"), BandMembers("c", "d"))
val myBands = Seq("Band1","Band2")

带数据集的输出:

+----+----------+-----+
|name|instrument|value|
+----+----------+-----+
|a   |b         |Band1|
|a   |b         |Band2|
|c   |d         |Band1|
|c   |d         |Band2|
+----+----------+-----+

使用 RDD 打印(这些是行)

[a,b,Band1]
[c,d,Band2]
[c,d,Band1]
[a,b,Band2]

考虑为此使用 RDD zip。来自官方文档

RDD> zip(RDD 其他, scala.reflect.ClassTag 证据$11) 将这个 RDD 与另一个 RDD 压缩,返回键值对,每个 RDD 中的第一个元素,每个 RDD 中的第二个元素,