Как мне принудительно упорядочить (УПОРЯДОЧИТЬ ПО) в пользовательской функции агрегирования Presto

#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. Правильно, но вы также можете это обнаружить.