如何解决用于聚合的 @CombineFunction 的 Presto 实现需要有序的输入值
想象一下,我想开发一个需要有序输入才能正常工作的 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 在这方面做得很短。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。