如何在没有分组值的情况下对spark的数据集执行按值运算?

时间:2017-08-08 10:13:56

标签: java apache-spark

我有一个表由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);

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

2 个答案:

答案 0 :(得分:4)

您可以使用Window编写查询:

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

请务必导入org.apache.spark.sql.functions._org.apache.spark.sql.expressions.Window

答案 1 :(得分:1)

这是你需要做的事情

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")