scala - 使用 Seq ("key") 语法对 Spark DataFrame 进行左外复杂连接

标签 scala apache-spark apache-spark-sql

我需要使用数据帧转换以下 sql 连接。问题是我得到了重复的“关键”列

val result_sql = sparkSession.sql(" select * from TAB_A a left outer join TAB_B b on a.key = b.key AND a.e_date between b.start_date and b.end_date ")

result_sql.printSchema()

root
|-- key: string (nullable = true)
|-- key: string (nullable = true)
|-- VAL: double (nullable = true)

所以我尝试过这个,但得到了相同的重复列“key”

val result_df = TAB_A.join(TAB_B,TAB_A.col("key") === TAB_B.col("key")
                             && TAB_A.col("e_date").between(TAB_B.col("start_date"),TAB_B.col("start_date")),
                        "left_outer")

root
|-- key: string (nullable = true)
|-- key: string (nullable = true)
|-- VAL: double (nullable = true)

然后我尝试使用 Seq ,但无法实现复杂的连接并面临错误

val result_df = TAB_A.join(TAB_B,Seq("key") && TAB_A.col("e_date").between(TAB_B.col("start_date"),TAB_B.col("start_date")),
                        "left_outer")

预期架构:

root
|-- key: string (nullable = true)
|-- VAL: double (nullable = true)

在没有重复列的情况下实现上述逻辑的任何最佳解决方案。

注意:我正在寻找使用 Spark 数据帧而不是 Spark_sql 查询的解决方案。

最佳答案

该 SQL 的问题在于,结果中有两个来自两个联接表的同名列(键)。

解决方案#1 为按键分配不同的名称。
例如设置左表列名为k1
设置右表的列名为k2

解决方案#2 指定要保留在结果表中的列

SELECT a.*, b.val1, b.val2
FROM TAB_A a left outer join TAB_B b on a.key = b.key AND a.e_date between b.start_date and b.end_date 


// Since you you only want to keep one key, please change the code you have
val result_df = TAB_A.join(TAB_B,TAB_A.col("key") === TAB_B.col("key")
                         && TAB_A.col("e_date").between(TAB_B.col("start_date"),TAB_B.col("start_date")),
                    "left_outer")
// drop the key from TAB_B or TAB_A
val result_df = TAB_A.join(TAB_B,TAB_A.col("key") === TAB_B.col("key")
                         && TAB_A.col("e_date").between(TAB_B.col("start_date"),TAB_B.col("start_date")),
                    "left_outer").drop(TAB_B("key"))

关于scala - 使用 Seq ("key") 语法对 Spark DataFrame 进行左外复杂连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46703073/

相关文章:

apache-spark - 使用 Spark pandas_udf 创建具有动态输入列数的列

Scala:Function0 与按名称参数

string - Scala 子字符串并将其存储在 DF 中

java - 包私有(private)方法覆盖时发生AbstractMethodError

python - 结合多个带有不同列的pyspark数据框

scala - 在 Apache Spark 中连接到 SQLite

apache-spark - 如何将列添加到 pyspark 数据框中的嵌套结构中?

Scala 代码在 Intellij 上运行,但不在 Apache Zeppelin notebook 上运行

apache-spark - Spark - 连接一对多关系数据框

Scala - 当文件路径不存在时读取 DataFrame