单个表达式中的Spark多重计数不同

时间:2018-05-14 19:51:44

标签: apache-spark apache-spark-sql databricks

我使用Scala和SQL API在Spark中编写了以下代码:

sourceData
  .groupBy($"number")
  .agg(                        
       countDistinct(when(...something...)),
       countDistinct(when(...something...)),
       countDistinct(when(...something...)),
       countDistinct(when(...something...))),
       countDistinct(when(...something...)))

当我检查执行计划时,Spark会在内部执行一个名为“expand”的操作,并将记录倍增5次(对于每个计数不同的列)。由于我已有数十亿条记录,因此效率非常低。有没有办法以更有效的方式做到这一点,请不要说countApproxDistinct因为我需要确切的值:)

1 个答案:

答案 0 :(得分:0)

您可以尝试在聚合之前设计新列(1或0),然后只执行max()。这应该减少扫描次数。

sourceData
  .withColumn("engineered_col1", expr("CASE WHEN ... THEN 1 ELSE 0 END")
  .withColumn("engineered_col2", expr("CASE WHEN ... THEN 1 ELSE 0 END")
  .groupBy($"number")
  .agg(max($"engineered_col1"),max($"engineered_col2"))