#aggregation #partitioning #presto #nosql-aggregation #trino
#агрегация #разделение #presto #nosql-агрегация #trino
Вопрос:
Я пишу пользовательскую функцию агрегирования 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 (или неправильный порядок)?
Комментарии:
1. Это выглядит совместимым с поведением других встроенных агрегатных функций и SQL в целом: если вызывающий абонент хочет упорядочить, он должен четко указать это.
2. Спасибо! Не могли бы вы указать мне на встроенную агрегатную функцию, которая обеспечивает выполнение этого во время выполнения?
3. Я имел в виду, что не реализация стратегии сортировки по умолчанию согласуется с тем, что делают встроенные модули. Некоторые из них принимают
ORDER BY
предложение (arry_agg()
,string_agg()
, …) — и если вызывающий не указывает его, порядок результатов не определен.4. Я немного смущен реализацией этого
@CombineFunction
. Будет ли группа / раздел разделяться дальше? Если это так, один раздел может быть «посередине» и не начинать обработку раздела с наименьшего значения. Я пытаюсь реализовать здесь операцию «сворачивания».
Ответ №1:
При разработке MY_AGG_FUNC есть ли способ принудительно упорядочить ПО значению ASC внутри, не полагаясь на вызывающую сторону, чтобы добавить ее в запрос?
Это невозможно сделать.
В качестве альтернативы, есть ли способ создать исключение, если пользователь вообще не указывает ORDER BY (или неправильный порядок)?
Это невозможно сделать, кроме как проверить в реализации функции агрегирования, что полученные значения находятся в порядке возрастания.
Комментарии:
1. Поэтому я мог бы просто сохранить «предыдущее значение» в «состоянии» функции агрегации и выдать исключение, если «следующее значение» строго меньше «предыдущего значения». Я думаю, это обеспечило бы правильность
2. Какова роль
@CombineFunction
, если мне требуется, чтобы входные данные были отсортированы? т.Е. Реализация похожа на «fold» (она должна начинать вычисления с самой первой строки). Есть ли вероятность, что внутреннее разделение повлияет на конечный результат?3. Правильно, но вы также можете это обнаружить.