我有一个关于Spark窗口函数的相当简单(但必不可少)的问题(例如lead, lag, count, sum, row_number
等):
如果将我的窗口指定为Window.partitionBy(lit(0))
(即我需要在整个数据帧中运行窗口函数),窗口聚合函数是否并行运行,或者所有记录都移动到一个单独的任务中?
编辑:
特别是对于“滚动”操作(例如使用类似avg(...).Window.partitionBy(lit(0)).orderBy(...).rowsBetween(-10,10)
的滚动平均值),这个操作很可能被分成不同的任务,即使所有数据都在窗口的同一个分区中,因为一次只需要20行来计算平均
如果你定义为Window.partitionBy(lit(0))
或者你根本没有定义partitionBy
,那么所有partitions
的dataframe
将是collected
作为一个executor
并且executor
将在整个aggregating
上执行dataframe
函数。所以parallelism
将不会被保留。
该集合不同于collect()
函数,因为collect()
函数将所有partitions
收集到driver
节点,但partitionBy
函数将收集数据到executor
,其中partitions
易于收集。