【问题标题】:How to perform count by value operation on spark's Dataset without grouping values?如何在不分组值的情况下对 Spark 的数据集执行按值计数操作?
【发布时间】:2017-08-08 18:38:43
【问题描述】:

我有一个由 spark Dataset

表示的表
origin.show();

+------+
|Origin|
+------+
|   USA|
| Japan|
|   USA|
|   USA|
| Japan|
|Europe|
+------+

我想建立额外的“countByValue”列来获取表格

+------+-----+
|Origin|Count|
+------+-----+
|Europe|    1|
|   USA|    3|
|   USA|    3|
|   USA|    3|
| Japan|    2|
| Japan|    2|
+------+-----+

我找到了解决方案,但似乎效率很低。我对原始数据集进行分组并使用计数功能。

Dataset<Row> grouped = origin.groupBy(originCol).agg(functions.count(originCol));
grouped.show();

+------+-----+
|Origin|Count|
+------+-----+
|Europe|    1|
|   USA|    3|
| Japan|    2|
+------+-----+

然后我只是将结果表与原始数据集连接起来。

Dataset<Row> finalDs = origin.join(grouped, originCol);

还有其他更有效的方法来执行这种操作吗?

【问题讨论】:

    标签: java apache-spark


    【解决方案1】:

    您可以使用 Window 编写查询:

    origin.withColumn("cnt", count('Origin).over(Window.partitionBy('Origin)))
    

    记得导入org.apache.spark.sql.functions._org.apache.spark.sql.expressions.Window

    【讨论】:

      【解决方案2】:

      这是你需要做的

      org.apache.sql.functions._
      
      val df = Seq(
          ("USA"),
          ("Japan"),
          ("USA"),
          ("USA"),
          ("Japan"),
          ("Europe")
      ).toDF("origin")
      
      
      val result = df.groupBy("origin").agg(collect_list($"origin").alias("origin1"),
        count("origin").alias("count"))
        .withColumn("origin", explode($"origin1")).drop("origin")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-06
        • 1970-01-01
        • 2018-07-26
        • 2020-10-20
        • 1970-01-01
        • 2020-10-25
        • 2011-07-25
        • 2020-03-17
        相关资源
        最近更新 更多