我需要使用按2列划分的窗口函数,并在第3列和第4列进行不同的计数。我可以算出任何问题,但是使用不同的计数会抛出异常-
rg.apache.spark.sql.AnalysisException: Distinct window functions are not supported:
有什么解决方法吗?
先前的答案提出了两种可能的技术:近似计数和size(collect_set(...))
。两者都有问题。
如果需要精确计数,这是在大数据中使用COUNT(DISTINCT ...)的主要原因,则不会进行近似计数。同样,对于小数据,对实际错误率的近似计数可能会有很大差异。
size(collect_set(...))
可能会导致大数据处理速度大幅下降,因为它使用可变的Scala HashSet
,这是一个非常慢的数据结构。另外,您有时可能会得到奇怪的结果,例如,如果在空的数据帧上运行查询,因为size(null)
会产生与直觉相反的-1。由于多种原因,Spark的本机非重复计数运行速度更快,主要是因为它不必在数组中生成所有计数的数据。
解决此问题的典型方法是使用自联接。您可以根据需要对任何列进行分组,计算非重复计数或任何其他不能用作窗口函数的聚合函数,然后再联接回原始数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句