scala - 如何计算多列中唯一值的数量?
问题描述
如何计算两列中唯一值的数量,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)。
解决方案
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] |
+----+--------------+--------------+
我希望答案有帮助
推荐阅读
- image-processing - 图像分割中的高阶势解释
- curl - 按照 IBM 教程中的示例代码访问 IBM 语音到文本服务时收到错误“未授权”
- javascript - 如果该属性内部也有嵌套属性,如何将多个属性分配给现有对象?
- google-cloud-platform - 有什么办法可以提高 Google Compute Engine 的上传速度?
- php - 如何在解析之前确保 CSV 文件包含数据?
- javascript - 为什么不能将条件表达式传递给 Javascript 哈希键?
- c - 如何实现:如果函数还没有被调用,做点什么?
- android - 无法在 PC 上从 Android 手机接收 UDP 数据包
- java - 文件路径仅适用于 IDE,但不适用于 jar 文件
- c++11 - 如何将向量与来自不同类和头文件的矩阵相乘?