2017-10-12 64 views
1

我需要使用數據框轉換下面的SQL聯接。這個問題是我得到複製「關鍵」列左外複雜使用Seq(「key」)語法加入Spark DataFrames

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) 

然後我就使用了序列嘗試登陸上去,但無法實施複雜的加入,面對錯誤

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查詢的解決方案。

+0

一種替代列只需在連接之後刪除一個'key'列即可。 – Shaido

回答

2

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

我需要使用spark數據框而不是spark_sql查詢來實現解決方案 – raam