我当前正在使用的数据帧(df
)有1000万行。看起来像这样
col1 col2
a p1
a p1
a p2
a p2
a p3
a p3
b p1
b p3
b p3
b p2
b p2
b p2
我需要为col2
中的每个值计算col1
中不同值的数量。
所以,我的预期输出是
col4 col5 col6
a p1 2
a p2 2
a p3 2
b p1 1
b p2 3
b p3 2
我尝试使用countDistinct
和approx_count_distinct
,但是运行代码需要花费数小时(> 10个小时),这真令人沮丧!
我尝试了以下代码
代码1
df2 = df
.groupBy($"col1", $"col2")
.agg(approx_count_distinct($"col2"))
代码2(比代码1花费更多的时间)
df2 = df
.groupBy($"col1", $"col2")
.agg(countDistinct($"col2"))
是否有更好的方法来计数不同的值以减少代码运行时间?谢谢。
答案 0 :(得分:0)
您的代码无法编译(至少使用Spark 2.3.1)。
我需要计算col2中每个值的不同数量 在col1中。
为此,您应该
val df2 = df
.groupBy($"col1")
.agg(countDistinct($"col2"))
您确定代码的这一部分要花这么长时间吗?您可以尝试运行df.rdd.count
来查看您的瓶颈是否已经在df
答案 1 :(得分:-1)
什么是col3?
您所需要的只是我想的
df2 = df.groupBy($"col1",$"col2").count
还有很多执行者
这是您发布的数据中的示例
scala> val df = Seq(
| ("a", "p1"),
| ("a", "p1"),
| ("a", "p2"),
| ("a", "p2"),
| ("a", "p3"),
| ("a", "p3"),
| ("b", "p1"),
| ("b", "p3"),
| ("b", "p3"),
| ("b", "p2"),
| ("b", "p2"),
| ("b", "p2")).toDF("col1", "col2")
df: org.apache.spark.sql.DataFrame = [col1: string, col2: string]
scala> val df2 = df.groupBy($"col1",$"col2").count
df2: org.apache.spark.sql.DataFrame = [col1: string, col2: string, count: bigint]
scala> df2.show
+----+----+-----+
|col1|col2|count|
+----+----+-----+
| a| p1| 2|
| a| p2| 2|
| a| p3| 2|
| b| p1| 1|
| b| p2| 3|
| b| p3| 2|
+----+----+-----+