2016-03-02 112 views
4

我正在使用火花與斯卡拉。 Spark版本1.5我試圖將具有名稱值組合的輸入數據框轉換爲新的數據框,其中將所有名稱轉換爲列並將值轉換爲行。收起火花數據幀

I/P數據幀:

ID名稱值
1國美
2國美
2狀態NY
3國英國
4國印度
4國MH
5國US
5 State NJ
5 County Hudson

Link here for image

換位據幀

ID國家州縣
1我們null null
2美國紐約州NULL
3 UK NULL NULL
4印度MH NULL
5美國新澤西州哈得遜
Link to transposed image
似乎像pivot會在這個用例中有所幫助,但在spark 1.5.x中不支持它版本。

任何指針/幫助?

回答

4

這是一個十分可怕的數據,但你總是可以過濾並加入:

val names = Seq("Country", "State", "County") 

names.map(name => 
    df.where($"Name" === name).select($"ID", $"Value".alias("name")) 
).reduce((df1, df2) => df1.join(df2, Seq("ID"), "leftouter")) 

map創建三個DataFrames其中每個表中包含一個只包含名稱記錄列表。接下來我們只需使用左外連接reduce這個列表。所以,把他們放在一起,你得到的東西是這樣的:

(left-outer-join 
    (left-outer-join 
    (where df (=== name "Country")) 
    (where df (=== name "State"))) 
    (where df (=== name "County"))) 

注意:如果您使用的Spark> = 1.6與Python或斯卡拉,或Spark> = 2.0 R,只是用透視與first