当JOIN列不同时,使用Spark Scala动态联接数据框

时间:2018-10-29 23:04:38

标签: scala apache-spark apache-spark-sql

Dynamically select multiple columns while joining different Dataframe in scala spark

通过上面的链接,我可以使用join表达式,但是如果列名不同,该怎么办,我们不能使用Seq(columns),而是需要动态地对其进行连接。这里的left_ds和right_ds是我想要加入的数据框。 下面我想加入id = acc_id和“ acc_no = number”列

left_da => id,acc_no,name,ph

right_ds => acc_id,编号,位置

val joinKeys="id,acc_id|acc_no,number"
val joinKeyPair: Array[(String, String)] = joinKeys.split("\\|").map(_.split(",")).map(x => x(0).toUpperCase -> x(1).toUpperCase)

val joinExpr: Column = joinKeyPair.map { case (ltable_col, rtable_col) =>left_ds.col(ltable_col) === right_ds.col(rtable_col)}.reduce(_ and _)

left_ds.join(right_ds, joinExpr, "left_outer")

上面是我正在尝试的联接表达式,但它不起作用。如果连接列名称不同而又不使用Seq,是否有一种方法可以实现此目的。因此,如果加入键的数量增加,我仍然应该能够使代码动态地工作。

1 个答案:

答案 0 :(得分:0)

使用别名必须正常工作

val conditionArrays = joinKeys.split("\\|").map(c => c.split(","))
val joinExpr = conditionArrays.map { case Array(a, b) => col("a." + a) === col("b." + b) }.reduce(_ and _)
left_ds.alias("a").join(right_ds.alias("b"), joinExpr, "left_outer")