Spark中每种类型的最佳计数方法

时间:2018-02-14 07:54:11

标签: apache-spark apache-spark-sql

我想知道将以下源数据集转换为目标数据集的最佳方法是什么:
来源数据集:

ID | Type | Count
111|  A   | 1
111|  B   | 2
111|  C   | 1
222|  A   | 3
333|  C   | 2

目标数据集:

ID  |#ofTypeA | #ofTypeB | #ofTypeC
111 |   1     |    2     |    1
222 |   3     |    0     |    0
333 |   0     |    0     |    2

源数据集是使用GroupBy(ID,Type).count()从原始数据集创建的。 现在,我能想到的唯一方法是将原始数据集与源数据集连接多次,每次创建一个新列来计算每种类型。 但它将在3个连接中解决。 我想知道是否有更好的方法来做到这一点

原始数据集如下:

ID | Type
111| A
111| B
111| B
.......

1 个答案:

答案 0 :(得分:3)

您可以pivot使用groupby来获得所需的结果

  val df = Seq(
    (111, "A", 1),
    (111, "B", 2),
    (111, "C", 1),
    (222, "A", 3),
    (333, "C", 2)
  ).toDF("Id", "Type", "Count")

  df.groupBy("Id")
    .pivot("Type")
    .agg(sum($"Count"))
    .na.fill(0)
    .show(false)

您可以使用na.fill(0)null替换为0

希望这有帮助!