首页 > 解决方案 > 如何计算多列中唯一值的数量?

问题描述

如何计算两列中唯一值的数量,col1并按 col2分组col0

 col0   col1   col2
 x      A      B
 x      A      C
 x      C      A
 x      C      D

以下命令似乎计算了列组合的唯一数量:

df.groupBy("col0").agg(countDistinct("col1","col2"))

预期输出为 4(A、B、C、D)。

标签: scalaapache-sparkapache-spark-sql

解决方案


countDistinct内置功能是您正在寻找的

import org.apache.spark.sql.functions._
df.groupBy("col0").agg(countDistinct("col1", "col2").as("distinctCounts")).show(false)

这应该给你

+----+--------------+
|col0|distinctCounts|
+----+--------------+
|x   |4             |
+----+--------------+

您可以更进一步,使用collect_set内置函数在每列中收集不同的字符串,然后使用udf函数将聚合的不同字符串作为

import org.apache.spark.sql.functions._
def distinctValues = udf((col1: Seq[String], col2: Seq[String]) => col1 ++ col2 distinct)

df.groupBy("col0").agg(countDistinct("col1", "col2").as("distinctCounts"), distinctValues(collect_set("col1"), collect_set("col2")).as("distinctValues")).show(false)

这应该给你

+----+--------------+--------------+
|col0|distinctCounts|distinctValues|
+----+--------------+--------------+
|x   |4             |[C, A, B, D]  |
+----+--------------+--------------+

进一步的一步是使用内置函数对从函数sort_array返回的不同字符串进行排序udf

df.groupBy("col0").agg(countDistinct("col1", "col2").as("distinctCounts"), sort_array(distinctValues(collect_set("col1"), collect_set("col2"))).as("distinctValues")).show(false)

这应该给你

+----+--------------+--------------+
|col0|distinctCounts|distinctValues|
+----+--------------+--------------+
|x   |4             |[A, B, C, D]  |
+----+--------------+--------------+

我希望答案有帮助


推荐阅读