presto实现@combinefunction,用于需要有序输入值的聚合

kmynzznz  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(377)

想象一下我想开发一个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 是否连续且有序?

w51jfk4q

w51jfk4q1#

这是一个猜测,因为普雷斯托似乎没有很好的文件在这个问题上。我甚至没有看到任何暗示 ORDER BY 在UDF中受支持(尽管在某些内置函数中受支持)
数据处理会在幕后的工作人员中进行吗?
数据处理应该是。但这种分裂应该在 key 水平。具有给定键的所有值都应发送到同一节点。
如果是这样,是否有任何保证,分裂将合并回“秩序”?
我很难想象一个实现,在调用聚合器之前,行是不排序的——如果语法支持的话 ORDER BY .
不幸的是,我认为“保证”是“记录在案的行为”,而普雷斯托在这方面相当欠缺。

相关问题