问题描述
想象一下,我想开发一个需要有序输入才能正常工作的 Presto AggregationFunction
。它将被调用如下:
WITH my_table AS (
SELECT *
FROM (
VALUES
('a',1),-- worker 1
('a',2),-- worker 2
('a',3),4),-- worker 3
('a',5),6),-- worker 3
) AS t (key,val)
)
SELECT key,MY_AGG_FUNC(val ORDER BY val)
FROM my_table
GROUP BY key
数据处理是否会在幕后工作人员之间分配?如果是这样,是否可以保证拆分也将“按顺序”合并回来?例如
- 好的:(workerState1 + workerState2) + workerState3
- 好的:workerState1 + (workerState2 + workerState3)
- 不行:workerState2 + (workerState1 + workerState3)
换句话说...我是否必须实现以下内容:
@CombineFunction
public static void combine(@AggregationState MyState mySate,@AggregationState MyState myOtherState);
我是否可以假设 myState
和 myOtherState
连续和有序?
解决方法
这有点猜测,因为 Presto 似乎没有关于这个主题的很好的文档。我什至没有看到任何表明 UDF 支持 ORDER BY
的内容(尽管某些内置函数支持)
数据处理是否会在幕后工作人员之间分担?
数据处理应该是。但这种拆分应该在 key
级别。具有给定键的所有值都应发送到同一节点。
如果是这样,是否可以保证拆分也会“按顺序”合并回来?
如果语法支持 ORDER BY
,我很难想象在调用聚合器之前 行没有排序的实现。
不幸的是,我认为“保证”是“记录在案的行为”,而 Presto 在这方面做得很短。