我使用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因为我需要确切的值:)
答案 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"))