如何计算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)。
答案 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] |
+----+--------------+--------------+
我希望答案很有帮助