【问题标题】:Scala - groupBy and count instances of each valueScala - groupBy 并计算每个值的实例
【发布时间】:2018-08-30 09:24:59
【问题描述】:

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

提前谢谢你。

【问题讨论】:

    标签: scala apache-spark dataframe


    【解决方案1】:

    您可以先按两列分组(使用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]]|
    // +--------+--------------------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-23
      • 2019-09-08
      • 1970-01-01
      • 2017-07-24
      • 2021-11-08
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多