2017-09-12 46 views
0

我正在對Cassandra進行SQL遷移,並且在將多個列合併到單個列中時遇到問題。例如,假設我有一個人可以參加一場或多場比賽。我現在每個人都有0或1的比賽。我如何能夠將它作爲一個集合合併到一個列中?Scala Spark將多個列中的值聚合到新列中

   SQL Schema 
+----------------------------------+ 
- R_White R_Af_American R_Asian - 
- 1   1   1  - 
- 0   1   1  - 
- 1   0   1  - 
- 0   1   0  - 
+----------------------------------+ 

        Cassandra Temp Desired Schema 
+-------------------------------------------------------------------+ 
- R_White R_Af_American R_Asian   Race      - 
- 1   1   1  ["White","Af American", "Asian"]- 
- 0   1   1  ["Af American", "Asian"]  - 
- 1   0   1  ["White", "Asian"]    - 
- 0   1   0  ["Af American"]     - 
+-------------------------------------------------------------------+ 

因爲我讀的CSV數據,我計劃在表中讀取從SQL星火,因爲它們是,執行合併(投入到比賽中列),然後刪除所有比其他的那些列新的比賽專欄。 (col(「R_White」)=== 1,somehow_add_to_set).otherwise(...)我不知道如何處理這些數據,但是這似乎並不適合。模式。任何幫助將不勝感激!謝謝!爲實現這一

+0

可以提供該表的架構和你想要添加到該集合的內容:通過數據框的列名映射到這些when表達式的硬編碼值? –

+0

這是上面更清楚嗎?我編輯了表格並添加了一些我的場景的更多解釋 –

+0

Tzach已經回答了它。沒有幫助嗎? –

回答

1

一種方法是使用array功能和when表達每個值,然後使用丟棄null s到創建數組一個UDF:

import org.apache.spark.sql.functions._ 
import spark.implicits._ 

val dropNulls = udf { (a: Seq[String]) => a.filter(_ != null) } 

val result = df.withColumn("Race", dropNulls(array(
    when($"R_White"  === 1, "R_White"), 
    when($"R_Af_American" === 1, "R_Af_American"), 
    when($"R_Asian"  === 1, "R_Asian") 
))) 

你也可以擺脫

val result = df.withColumn("Race", dropNulls(array(
    df.columns.map(name => when(col(name) === 1, name)): _* 
))) 

result.show(false) 
// +-------+-------------+-------+---------------------------------+ 
// |R_White|R_Af_American|R_Asian|Race        | 
// +-------+-------------+-------+---------------------------------+ 
// |1  |1   |1  |[R_White, R_Af_American, R_Asian]| 
// |0  |1   |1  |[R_Af_American, R_Asian]   | 
// |1  |0   |1  |[R_White, R_Asian]    | 
// |0  |1   |0  |[R_Af_American]     | 
// +-------+-------------+-------+---------------------------------+ 
+0

這就是我需要的,非常感謝你! –

相關問題