用于聚合的 @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);

我是否可以假设 myStatemyOtherState 连续有序

解决方法

这有点猜测,因为 Presto 似乎没有关于这个主题的很好的文档。我什至没有看到任何表明 UDF 支持 ORDER BY 的内容(尽管某些内置函数支持)

数据处理是否会在幕后工作人员之间分担?

数据处理应该是。但这种拆分应该在 key 级别。具有给定键的所有值都应发送到同一节点。

如果是这样,是否可以保证拆分也会“按顺序”合并回来?

如果语法支持 ORDER BY,我很难想象在调用聚合器之前 行没有排序的实现。

不幸的是,我认为“保证”是“记录在案的行为”,而 Presto 在这方面做得很短。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...