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,是否有一种方法可以实现此目的。因此,如果加入键的数量增加,我仍然应该能够使代码动态地工作。
答案 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")