我有一个DataFrame DF,我想计算2类(Cat1和Cat2)下每个txn的数量。
DF
+------------+-------+
| Category | txn |
+-----===----+-------+
| Cat1 | A |
| Cat2 | A |
| Cat1 | B |
| Cat1 | C |
| Cat2 | D |
| Cat1 | D |
| Cat2 | C |
| Cat1 | D |
| Cat1 | A |
| Cat2 | C |
| Cat1 | D |
| Cat1 | A |
| Cat2 | B |
| Cat1 | C |
| Cat2 | D |
+------------+-------+
代码:
DF.groupBy("category_name").agg(count("txn").as("txn_count")).show(false)
但这只能给我每个类别的总数。
所需的输出:(格式无关紧要,只需要计数)
+------------+---------------------+
| Category | txn_count |
+-----===----+---------------------+
| Cat1 | A(3),B(1),C(2),D(3) |
| Cat2 | A(1),B(1),C(2),D(2) |
+------------+---------------------+
谢谢。
答案 0 :(得分:3)
您可以先按两列分组(使用count
),然后仅按Category
分组(使用collect_list
):
import org.apache.spark.sql.functions._
import spark.implicits._
val result = DF
.groupBy("Category", "txn").count()
.groupBy("Category").agg(collect_list(struct("txn", "count")) as "txn_count")
result.show(false)
// prints:
// +--------+--------------------------------+
// |Category|txn_count |
// +--------+--------------------------------+
// |Cat2 |[[D, 2], [C, 2], [B, 1], [A, 1]]|
// |Cat1 |[[D, 3], [C, 2], [B, 1], [A, 3]]|
// +--------+--------------------------------+