簡體   English   中英

Spark-SQL連接具有相同列名的兩個數據幀/數據集

[英]Spark-SQL Joining two dataframes/ datasets with same column name

我有兩個數據集

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

似乎存在問題,因為兩個數據幀都有merchant_id列。

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

您正在使用sf_account_columns中列出的列加入DataFrame。 此數組不包含要加入的列,因此DataFrame也沒有。 將此列添加到提到的數組中

如果兩個DataFrame中的連接列的名稱相同,則可以將其定義為連接條件。 在Scala中它更清晰,使用Java需要將Java List轉換為Scala Seq:

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

這將導致DataFrame僅包含一個連接列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM