【问题标题】:Join Dataframes dynamically using Spark Scala when JOIN columns differ当 JOIN 列不同时,使用 Spark Scala 动态连接数据帧
【发布时间】:2019-04-02 22:55:19
【问题描述】:

Dynamically select multiple columns while joining different Dataframe in scala spark

从上面的链接,我可以让连接表达式工作,但是如果列名不同,我们不能使用 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,有没有办法实现这一点?因此,如果连接键的数量增加,我应该仍然能够使代码动态工作。

【问题讨论】:

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


    【解决方案1】:

    使用别名必须正常工作:

    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")
    

    【讨论】:

    • 在地图函数的第二行,这样的代码可以使用“left_ds.col(a) === right_ds.col(b)”,没有别名
    • 当然,“a”和“b”只是举例。
    • 在这种情况下如何避免重复列?
    • join后,可以只选择需要的列,可以使用join时分配的别名。
    • 也可以使用“equalTo”方法避免别名:“left_ds.col(a).equalTo(right_ds.col(b))”
    猜你喜欢
    • 2021-10-20
    • 2017-09-04
    • 1970-01-01
    • 2015-02-08
    • 2018-10-25
    • 2021-06-02
    • 1970-01-01
    • 2019-08-01
    • 2020-10-02
    相关资源
    最近更新 更多