我在星火查询中有一组窗口函数,其中包括user_num上的分区。其中一个user_nums比其他的行多得多。这一行是计算在一个单一的任务,其中有一个更高的洗牌读取,洗牌远程读取,最终需要大量的时间。
Select LAG(e) OVER (PARTITION BY user_num, a, date ORDER BY time) as aa,
FIRST_VALUE(e) OVER (PARTITION BY a, date ORDER BY time ROWS
BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) as bbb
FROM table
是否有任何设置或方法可以在不同的任务上运行此操作,或者以其他方式以不需要或最小更改窗口函数逻辑的方式缩短此时间?
例如,我可以在某个点缓存,增加分区数量,增加exec等。
发布于 2021-07-14 08:46:20
我做的两件事在这里起了作用:
中的一个bug。
FIRST_VALUE(e)以bbb的形式(按时间进行分区,按时间顺序在无界前行行和当前行之间的行)
发布于 2021-07-06 12:03:36
建议通过牺牲一些数据损失来扩大规模,即增加分区窗口上的粒度。
示例:
进行分区。
现在,您的单个任务将被划分为24个任务。
但是这将为您的滞后带来更多的。例如,如果计算滞后值的偏移量为4,那么对于每小时的数据,将有3个NULL值。
因此,这就像在速度与精确数据之间的权衡。
您可以以更多的NULLS为代价,进一步将粒度提高到分钟,以获得更多的并行性。
进一步改善损失期间:
如果您选择使用较低的粒度,这可能会影响其他"user_nums“。最好将其划分为2个dfs:
将fixed.)
结果= result_from_Skew.union(result_from_normal)
https://stackoverflow.com/questions/68232108
复制相似问题