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