我使用Spark 2.1。
我在Spark Dataframe中有一些数据,如下所示:
**ID** **type** **val**
1 t1 v1
1 t11 v11
2 t2 v2
我想使用spark Scala(最好)或Spark SQL来调整这些数据,以便最终输出如下所示:
**ID** **t1** **t11** **t2**
1 v1 v11
2 v2
答案 0 :(得分: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|
+---+---+---+---+
注意:根据实际数据,即ID
和type
的每种组合有多少值,您可以选择不同的聚合函数。
答案 1 :(得分:2)
这是一种方法:
val
请注意,如果与给定type
关联的type
不同,则会在df2
的{{1}}下对其进行分组(逗号分隔)。
答案 2 :(得分: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|
+---+----+----+----+