计算火花数据框中所有列(300 列)的每个不同值的出现次数

Posted

技术标签:

【中文标题】计算火花数据框中所有列(300 列)的每个不同值的出现次数【英文标题】:count occurrences of each distinct value of all columns(300 columns) in a spark dataframe 【发布时间】:2020-08-29 05:25:46 【问题描述】:

我有一个包含 300 列的 spark 数据框,每列有 10 个不同的值。我需要计算所有 300 列的不同值的出现次数。

  --------------------------------------------------------
     col1    |  col2    | col3 ............col299   | col 300
  -------------------------------------------------------
  value11    | value21  | value31       | value300  | value 301
  value12    | value22  | value32       | value300  | value 301
  value11    | value22  | value33       | value301  | value 302
  value12    | value21  | value33       | value301  | value 302

如果我使用下面的代码计算单列

import org.apache.spark.sql.functions.count
df.groupBy("col1").agg(count("col1")).show

但是如何有效地计算 300 列。请帮忙!

【问题讨论】:

如果您可以接受近似的不同计数,请考虑使用高效的approx_count_distinct 【参考方案1】:

如下所述,您可以轻松做到这一点

首先收集所有列名和转换作为键值。 如下所示

val exprs = df.columns.map((_ -> "approx_count_distinct")).toMap

那么简单的 df.groupBy("col1").agg(exprs) 将为您提供所有列的不同值。

参考:https://spark.apache.org/docs/2.3.1/api/sql/index.html#approx_count_distinct

【讨论】:

以上是关于计算火花数据框中所有列(300 列)的每个不同值的出现次数的主要内容,如果未能解决你的问题,请参考以下文章

如何通过比较火花中相同列的两个数据帧来计算列值的数量

合并,合并火花数据框中的 2 列

聚合火花数据框中的多列(所有组合)

遍历火花数据框中的列并计算最小值最大值

如何根据列在火花中重新分区?

将行值转换为火花数据框中的列数组