2017-10-18 77 views
0

我一直試圖添加一個數據幀的結果作爲另一個數據幀中的新數組字段基於一個鍵值。如何添加一個數據幀轉換爲陣列作爲另一個數據幀的一個元素基於一個鍵值

例如,我有這樣的數據幀我們稱之爲df1

root  
|-- DF_KEY: integer (nullable = false) 
|-- DF_DESC: string (nullable = false) 

+------------+--------------------+ 
|DF_KEY  |  DF_DESC  | 
+------------+--------------------+ 
|  10000|String Desc A  | 
|  10000|String Desc B  | 

而另一數據框df2

root 
|-- DF_KEY: integer (nullable = false) 
|-- COL_A: decimal(20,0) (nullable = true) 
|-- COL_B: decimal(20,0) (nullable = true) 
|-- COL_C: string (nullable = false) 

我想這兩個dataframes與df1的結果相結合一個新的數組ARRAY_OF_DF_DESC,這將導致數據框(newDF)具有以下模式。

root 
|-- DF_KEY: integer (nullable = false) 
|-- COL_A: decimal(20,0) (nullable = true) 
|-- COL_B: decimal(20,0) (nullable = true) 
|-- COL_C: string (nullable = false) 
|-- ARRAY_OF_DF_DESC : array (nullable = false) 
| |-- element: string (containsNull = false) 

我試圖做一個連接:

val otherRefsArray = df1.select($"DF_KEY", array(df1.columns.map(col): _*) as "ARRAY_OF_DF_DESC ") 

val newDF = df2.join(otherRefsArray, "DF_KEY") 

但這隻能加入每個df1行至newDf數據框添加了一個WrappedArray。並且它會爲每個DF_DESC返回重複記錄。

如果可能,我想通過一個WrappedArray,其中包含與該行相關的所有DF_DESC關聯DF_KEY。有誰知道如何用scala做到這一點?

回答

1

您可以使用groupBy()並收集每個密鑰的列表。

val otherRefsArray = df1.groupBy($"DF_KEY") 
    .agg(collect_list($"DF_DESC").as("ARRAY_OF_DF_DESC")) 

之後,以與以前相同的方式使用join

+0

這是唯一的選擇嗎?我在問,因爲我有一些與groupBy有關的問題,因爲模式中有一些重複。如果沒有其他選項,我將解決重複問題並嘗試groupBy。 –

+0

@RonniePhelps我會說'groupBy()'與'collect_list'是最簡單的解決方案,我不認爲你可以避免在'df1'數據框上進行某種分組,因爲你有多個相同的鍵。在這種情況下,不應該有任何重複的問題?或者還有其他專欄涉及這個問題嗎? – Shaido

+0

這只是我爲簡單發佈的一個示例,但還有其他屬性沒有列出在模式中有重複項。 –

相關問題