【问题标题】:How do I enforce ordering (ORDER BY) in a custom Presto Aggregation Function如何在自定义 Presto 聚合函数中强制执行排序 (ORDER BY)
【发布时间】:2021-03-30 02:27:47
【问题描述】:

我正在编写一个自定义 Presto 聚合函数,当(且仅当)值按我正在聚合的值按升序排序时,它会产生正确的结果。即

以下将起作用:

SELECT key, MY_AGG_FUNC(value ORDER BY value ASC) FROM my_table GROUP BY key

以下将产生不正确的结果:

SELECT key, MY_AGG_FUNC(value) FROM my_table GROUP BY key

在开发MY_AGG_FUNC 时,有没有办法在内部强制执行ORDER BY value ASC 而无需依赖调用者将其添加到查询中?

作为替代方案,如果用户根本没有指定 ORDER BY(或不正确的顺序),有没有办法抛出异常?

【问题讨论】:

  • 这看起来与其他内置聚合函数的行为以及一般 SQL 的行为一致:如果调用者想要排序,他应该明确说明。
  • 谢谢!你能指出一个在运行时强制执行的内置聚合函数吗?
  • 我的意思是 not 实现默认排序策略与内置函数的作用一致。其中一些接受ORDER BY 子句(arry_agg()string_agg(),...) - 如果调用者未指定它,则未定义结果的顺序。
  • 我对@9​​87654328@ 的实现有点困惑。组/分区会进一步拆分吗?如果是这样,一个分区可能处于“中间”,并且不会从最小值开始处理该分区。我正在尝试在这里实现“折叠”操作。

标签: aggregation partitioning presto nosql-aggregation trino


【解决方案1】:

在开发 MY_AGG_FUNC 时,有没有办法在内部强制执行 ORDER BY value ASC 而不依赖调用者将其添加到查询中?

没有办法做到这一点。

作为替代方案,如果用户根本没有指定 ORDER BY(或不正确的顺序),有没有办法抛出异常?

除了在聚合函数实现中检查接收到的值是否按升序排列之外,没有其他办法。

【讨论】:

  • 所以我可以将“前一个值”保留在聚合函数“状态”中,如果“下一个值”严格小于“前一个值”,则抛出异常。我猜这会强制正确
  • 如果我确实需要对输入进行排序,@CombineFunction 的作用是什么?即实现就像一个“折叠”(它必须从第一行开始计算)。内部分区是否有可能影响最终结果?
  • 正确,但您也可以检测到这一点。
猜你喜欢
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2017-11-08
  • 2013-03-29
相关资源
最近更新 更多