Scala 使用Seq(“key”)语法的Spark数据帧的左外部复杂联接

Scala 使用Seq(“key”)语法的Spark数据帧的左外部复杂联接,scala,apache-spark,apache-spark-sql,spark-dataframe,Scala,Apache Spark,Apache Spark Sql,Spark Dataframe,我需要使用dataframes转换下面的sql连接。问题是我得到了重复的“键”列 所以我尝试过这个,但是得到了相同的重复列“key” 然后我尝试使用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")),

我需要使用dataframes转换下面的sql连接。问题是我得到了重复的“键”列

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

然后我尝试使用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为键指定不同的名称。
e、 g.将左表的列名设置为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"))

另一种方法是在连接后简单地删除一个
列。我需要使用spark dataframes而不是spark_sql查询来实现解决方案
root
|-- key: string (nullable = true)
|-- VAL: double (nullable = true)
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"))