如何计算多列中唯一值的数量?

时间:2018-06-13 16:03:56

标签: scala apache-spark apache-spark-sql

如何计算docker run -d -p 8080:8080 --name mydockerapp myapp col1两列中唯一值的数量,按col2分组?

col0

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

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

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

1 个答案:

答案 0 :(得分:2)

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]  |
+----+--------------+--------------+

我希望答案很有帮助