想象一下我想开发一个presto AggregationFunction
这需要有序的输入才能正常工作。它将按如下方式调用:
WITH my_table AS (
SELECT *
FROM (
VALUES
('a', 1), -- worker 1
('a', 2), -- worker 2
('a', 3), -- worker 2
('a', 4), -- worker 3
('a', 5), -- worker 3
('a', 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
是否连续且有序?
1条答案
按热度按时间w51jfk4q1#
这是一个猜测,因为普雷斯托似乎没有很好的文件在这个问题上。我甚至没有看到任何暗示
ORDER BY
在UDF中受支持(尽管在某些内置函数中受支持)数据处理会在幕后的工作人员中进行吗?
数据处理应该是。但这种分裂应该在
key
水平。具有给定键的所有值都应发送到同一节点。如果是这样,是否有任何保证,分裂将合并回“秩序”?
我很难想象一个实现,在调用聚合器之前,行是不排序的——如果语法支持的话
ORDER BY
.不幸的是,我认为“保证”是“记录在案的行为”,而普雷斯托在这方面相当欠缺。