如何透视数据集?

时间:2017-05-30 17:16:06

标签: scala apache-spark apache-spark-sql

我使用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

3 个答案:

答案 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|
+---+---+---+---+

注意:根据实际数据,即IDtype的每种组合有多少值,您可以选择不同的聚合函数。

答案 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|
+---+----+----+----+