我有一个表由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);
还有其他更有效的方法来执行此类操作吗?
答案 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")