优化代码以对countDistinct / rox_count_distinct

时间:2018-10-12 12:29:07

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

我当前正在使用的数据帧(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

我尝试使用countDistinctapprox_count_distinct,但是运行代码需要花费数小时(> 10个小时),这真令人沮丧!

我尝试了以下代码

代码1

df2 = df
    .groupBy($"col1", $"col2")
    .agg(approx_count_distinct($"col2"))

代码2(比代码1花费更多的时间)

df2 = df
    .groupBy($"col1", $"col2")
    .agg(countDistinct($"col2"))

是否有更好的方法来计数不同的值以减少代码运行时间?谢谢。

2 个答案:

答案 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|
+----+----+-----+