GroupBy ID,然后根据行内的值创建列

时间:2018-10-31 19:13:29

标签: scala apache-spark dataframe

我正在尝试打开此火花数据框:

ID  STATUS  COUNT
a     1      3
a     2      2
b     2      4
c     3      5
d     1      3
d     2      3

对此:

+---+---+---+---+
| ID|  1|  2|  3|
+---+---+---+---+
|  a|  3|  2|  0|
|  b|  0|  4|  0|
|  c|  0|  0|  5|
|  d|  3|  3|  0|
+---+---+---+---+

对此我还比较陌生,我想做一些类似的事情:

df.withColumnRenamed("1", udf_sum_val1)
  .withColumnRenamed("2", udf_sum_val2)
  .withColumnRenamed("2", udf_sum_val3)

然后进行groupBy,并对所有值求和。

然后执行某种groupBys,但这并不正确。我想知道是否有人可以采用更好的方法?

1 个答案:

答案 0 :(得分:3)

不确定要执行的操作(您的示例尚不清楚),但这听起来像是枢轴操作:

val df = Seq(
  ("a", 1, 3),
  ("a", 2, 2),
  ("b", 2, 4),
  ("c", 3, 5),
  ("d", 1, 3),
  ("d", 2, 3)
).toDF("ID", "STATUS", "COUNT")

df
  .groupBy($"ID")
  .pivot("STATUS")
  .agg(sum($"COUNT"))
  .na.fill(0)
  .orderBy($"ID")
  .show()

+---+---+---+---+
| ID|  1|  2|  3|
+---+---+---+---+
|  a|  3|  2|  0|
|  b|  0|  4|  0|
|  c|  0|  0|  5|
|  d|  3|  3|  0|
+---+---+---+---+