使用 Seq( "key") 语法的 Spark 数据帧的左外复杂联接



我需要使用数据帧转换下面的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)

所以我尝试过这个,但得到了相同的重复列"键">

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

相关内容

  • 没有找到相关文章