在数据透视后

时间:2018-10-22 17:26:51

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

我有一个数据框,其中有许多列,几乎有50余列(如下所示),

+----+----+---+----+----+---+----+---+----+----+---+...
|c1  |c2  |c3 |c4  |c5  |c6  |c7 |c8 |type|clm |val |...
+----+----+---+----+----+---+----+---+----+----+---+...
|  11| 5.0|3.0| 3.0| 3.0|4.0| 3.0|3.0| t1 | a  |5   |...
+----+----+---+----+----+---+----+---+----+----+---+...
|  31| 5.0|3.0| 3.0| 3.0|4.0| 3.0|3.0| t2 | b  |6   |...
+----+----+---+----+----+---+----+---+----+----+---+...
|  11| 5.0|3.0| 3.0| 3.0|4.0| 3.0|3.0| t1 | a  |9   |...
+----+----+---+----+----+---+----+---+----+----+---+...

我想将一个列值转换为很多列,所以想使用下面的代码

df.groupBy("type").pivot("clm").agg(first("val")).show() 

这会将行值转换为列,但其他列(c1至c8)不作为结果数据帧的一部分。

所以可以执行以下方法以在透视后获取所有凝块

df.groupBy(“ c1”,“ c2”,“ c3”,“ c4”,“ c5”,“ c6”,“ c7”,“ c8”,“类型”).pivot(“ clm”) .agg(first(“ val”))。show()

1 个答案:

答案 0 :(得分:0)

pivot与其他任何数据集一样被视为聚合器。

df
  .groupBy("type")
  .agg(
    pivot("clm").first("val"),
    first("c1"),
    first("c2"),
    first("c3"),
    first("c4"),
    first("c5"),
    first("c6"),
    first("c7"),
    first("c8")
  ).show()

这样写是假设您在同一c1..c8中有type的重复值。如果没有,那么就需要对.groupby(...)进行调整,以精确地确定数据的组织方式。