2017-04-19 64 views
4

我有以下兩個數據集火花SQL連接兩個dataframes /數據集有相同的列名

controlSetDF : has columns loan_id, merchant_id, loan_type, created_date, as_of_date 
accountDF : has columns merchant_id, id, name, status, merchant_risk_status 

我使用Java的火花API加入他們,我需要在最終的數據集中只有特定的列

private String[] control_set_columns = {"loan_id", "merchant_id", "loan_type"}; 
private String[] sf_account_columns = {"id as account_id", "name as account_name", "merchant_risk_status"}; 

controlSetDF.selectExpr(control_set_columns)            
.join(accountDF.selectExpr(sf_account_columns),controlSetDF.col("merchant_id").equalTo(accountDF.col("merchant_id")), 
"left_outer"); 

,但我得到以下錯誤

org.apache.spark.sql.AnalysisException: resolved attribute(s) merchant_id#3L missing from account_name#131,loan_type#105,account_id#130,merchant_id#104L,loan_id#103,merchant_risk_status#2 in operator !Join LeftOuter, (merchant_id#104L = merchant_id#3L);;!Join LeftOuter, (merchant_id#104L = merchant_id#3L) 

似乎是一個問題,因爲這兩個dataframes已經MERCHANT_ID柱。

注意:如果我不使用.selectExpr()它工作正常。但它會顯示第一個和第二個數據集的所有列。

回答

1

如果連接列在兩個DataFrame中都命名相同,則可以簡單地將其定義爲連接條件。在斯卡拉這是一個有點清潔,使用Java需要Java列表轉換爲斯卡拉序列:

Seq<String> joinColumns = scala.collection.JavaConversions 
    .asScalaBuffer(Lists.newArrayList("merchant_id")); 

controlSetDF.selectExpr(control_set_columns) 
    .join(accountDF.selectExpr(sf_account_columns), joinColumns), "left_outer"); 

這將導致與只加入一列的數據幀。

+0

謝謝@Silvio。這工作。 – NewQueries

1

您正在使用DataFrame加入sf_account_columns中列出的列。這個數組不包含你想要加入的列,所以DataFrame也沒有它。將此列添加到提到的數組中

+0

這可以工作,但最終數據集將具有重複的merchant_id列條目。我如何避免這種情況?我想要最終數據集只顯示來自controlSetDF的merchant_id。 – NewQueries

+0

@NewQueries給這一列別名,並在加入後做選擇:) –

+0

謝謝@T。 Gaweda。是的,我最終會這樣做。感謝您的迴應。使用Seq 爲我工作 – NewQueries