Добавление столбца в таблицу с движком AggregatingMergeTree

641 views
Skip to first unread message

Юрий Думп

unread,
Feb 14, 2017, 4:07:26 AM2/14/17
to ClickHouse
Столкнулся с такой проблемой, есть таблица AggregatingMergeTree. Со временем возникла необходимость добавить в нее новый столбец
ALTER TABLE stat
ADD COLUMN
async_call_size AggregateFunction(sum, UInt64)

Столбец добавляется, но при попытке обращения к нему возникает ошибка
SELECT sumMerge(async_call_size)
FROM stat

Received exception from server:
Code: 116. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: There is no default value for AggregateFunction data type: (while reading from part /var/clickhouse//data/default/stat/20170119_20170131_227660_256716_198/).

Как я понял, столбца в куске нет и происходит попытка загрузить значение по умолчанию, которая заканчивается ошибкой, т.к. оно не описано. Попытка задать его тоже не приводит к положительному результату
ALTER TABLE stat
ADD COLUMN
async_call_size AggregateFunction(sum, UInt64) DEFAULT sumState(toUInt64(0))


Received exception from server:
Code: 184. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Aggregate function sumState(toUInt64(0)) is found in wrong place in query.

Вопрос. Как добавить столбец?

Vitaliy Lyudvichenko

unread,
Feb 14, 2017, 6:22:00 AM2/14/17
to ClickHouse
Да, вы правы - надо явно указать DEFAULT, чтобы движок понял какие значения для async_call_size подставлять в старых данных.
Но выражение sumState(toUInt64(0))  не может быть использовано как константа для DEFAULT value, потому что sumState - это аггрегатная функция, а не обычная.
Для того, чтобы укзать скалярную константу вам бы подошел например такой вариант с использованнием обычной функции arrayReduce: arrayReduce('sumState', [ toUInt64(0) ] ).
Но к сожалению сейчас поддержка аггрегатных функций с префиксом -State в функции arrayReduce не реализована:
Using aggregate function with -State modifier in function arrayReduce is not supported.

Но добавить их поддержку - относительно простая задача.

вторник, 14 февраля 2017 г., 12:07:26 UTC+3 пользователь Юрий Думп написал:

Юрий Думп

unread,
Feb 14, 2017, 6:43:00 AM2/14/17
to ClickHouse
То есть сейчас данную задачу я в принципе не смогу реализовать? Или есть обходные технологии?

вторник, 14 февраля 2017 г., 14:22:00 UTC+3 пользователь Vitaliy Lyudvichenko написал:

Vitaliy Lyudvichenko

unread,
Feb 14, 2017, 7:57:22 AM2/14/17
to ClickHouse
Похоже на то. Если не прибегать к созданию новых временных таблиц.

Если вам по времени не критично, можно подождать следующего релиза - мы скорее всего поправим это.
Или если вы сможете собрать clickhouse из исходников, могу прислать вам патч с фиксом.

вторник, 14 февраля 2017 г., 14:43:00 UTC+3 пользователь Юрий Думп написал:

Юрий Думп

unread,
Feb 14, 2017, 8:28:38 AM2/14/17
to ClickHouse
Пришлите, пожалуйста, патч, мы сами соберем. Задача для нас "горит". Заранее благодарен.

вторник, 14 февраля 2017 г., 15:57:22 UTC+3 пользователь Vitaliy Lyudvichenko написал:

Vitaliy Lyudvichenko

unread,
Feb 16, 2017, 7:08:15 AM2/16/17
to ClickHouse
Можете собрать из этой ветки https://github.com/yandex/ClickHouse/commits/CLICKHOUSE-2845-patch
Должно работать.


вторник, 14 февраля 2017 г., 16:28:38 UTC+3 пользователь Юрий Думп написал:
Reply all
Reply to author
Forward
0 new messages