Scala-groupBy并计算每个值的实例

时间:2018-08-29 15:49:47

标签: scala apache-spark dataframe

我有一个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) |
+------------+---------------------+

谢谢。

1 个答案:

答案 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]]|
// +--------+--------------------------------+