我使用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
我使用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
您可以使用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|
+---+---+---+---+
注:德等待實際數據,即每個組合ID
和type
有多少個值,則可以選擇不同的聚合函數。
這一個應該工作
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|
+---+----+----+----+
下面是做這件事:
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
。
以及你應該考慮從「Psidom」的答案作爲其照顧的空值[按照要求] – hadooper
我得到這個錯誤:錯誤:未找到:值第一 –
什麼是錯誤? – hadooper