2017-05-30 60 views
1

我使用Spark 2.1。如何透視數據集?

我有一個火花數據幀的一些數據,它看起來像下面:

**ID** **type** **val** 
    1  t1  v1  
    1  t11  v11 
    2  t2  v2  

我想用任一火花Scala的(優選地)或火花SQL,使得最終輸出應如下樞轉了這個數據:

**ID** **t1** **t11** **t2** 
    1  v1  v11 
    2       v2 

回答

2

您可以使用groupBy.pivot

import org.apache.spark.sql.functions.first 
df.groupBy("ID").pivot("type").agg(first($"val")).na.fill("").show 
+---+---+---+---+ 
| ID| t1|t11| t2| 
+---+---+---+---+ 
| 1| v1|v11| | 
| 2| | | v2| 
+---+---+---+---+ 

注:德等待實際數據,即每個組合IDtype有多少個值,則可以選擇不同的聚合函數。

1

這一個應該工作

val seq = Seq((123,"2016-01-01","1"),(123,"2016-01-02","2"),(123,"2016-01-03","3")) 
val seq = Seq((1,"t1","v1"),(1,"t11","v11"),(2,"t2","v2"))  
val df = seq.toDF("id","type","val") 
val pivotedDF = df.groupBy("id").pivot("type").agg(first("val")) 
pivotedDF.show 

輸出:

+---+----+----+----+ 
| id| t1| t11| t2| 
+---+----+----+----+ 
| 1| v1| v11|null| 
| 2|null|null| v2| 
+---+----+----+----+ 
+0

以及你應該考慮從「Psidom」的答案作爲其照顧的空值[按照要求] – hadooper

+0

我得到這個錯誤:錯誤:未找到:值第一 –

+0

什麼是錯誤? – hadooper

1

下面是做這件事:

val df = Seq(
    (1, "T1", "v1"), 
    (1, "T11", "v11"), 
    (2, "T2", "v2") 
).toDF(
    "id", "type", "val" 
).as[(Int, String, String)] 

val df2 = df.groupBy("id").pivot("type").agg(concat_ws(",", collect_list("val"))) 

df2.show 
+---+---+---+---+ 
| id| T1|T11| T2| 
+---+---+---+---+ 
| 1| v1|v11| | 
| 2| | | v2| 
+---+---+---+---+ 

需要注意的是,如果有與給定關聯的不同val小號type,它們將按照分組(逗號分隔)在df2