Clickhouse: populate and MATERIALIZED VIEW ... TO ...

Created on 24 Jul 2018  ·  5Comments  ·  Source: ClickHouse/ClickHouse

Есть такой запрос создания мат вью
CREATE MATERIALIZED VIEW loadstat_agg_view TO loadstat_agg
ENGINE = AggregatingMergeTree(date, (host, date), 8192) POPULATE AS
SELECT
host,
date,
countState() AS hitCount,
countState(if(load = 0, host, NULL)) AS badCount,
uniqState(ip) AS hostCount,
uniqState(host) AS siteCount,
uniqState(userAgent) AS uniqCount,
avgState(
if(
((resolved - opened) > 0)
AND ((resolved - opened) <= 60000),
resolved - opened,
NULL
) / 1000
) AS avgLoadTime
FROM
loadstat
GROUP BY
host,
date

Ругается:
Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 99 (line 2, col 1): ENGINE = AggregatingMergeTree(date, (host, date), 8192) POPULATE AS
SELECT
host,
date,
countState() AS hitCount,
countState(if(load = 0, host, NULL)) AS. Expected one of: token, OpeningRoundBracket, AS, e.what() = DB::Exception

Что не так?

Если убрать "ENGINE = AggregatingMergeTree(date, (host, date), 8192) POPULATE" запрос отрабатывает

comp-matview

Most helpful comment

Хм. POPULATE не работает с TO. См.

https://github.com/yandex/ClickHouse/blob/7bae3506c41be971ec6ec031c139f596e026a5f0/dbms/src/Parsers/ParserCreateQuery.cpp#L367

Легко обойти - можно просто INSERT ... SELECT сделать перед созданием матвью

Но действительно наверное несколько нелогично, по крайней мере должно быть какое-то внятное сообщение об ошибке.

All 5 comments

Если используется синтаксис с опцией TO, тогда предполагается что целевая таблица уже существует. А если таблица уже существует, то и параметры движка этой таблицы указывать не нужно.

См. примеры в тесте:
https://github.com/yandex/ClickHouse/blob/master/dbms/tests/queries/0_stateless/00508_materialized_view_to.sql

Убрал ENGINE, ругается теперь так:
Syntax error: failed at position 213 (line 3, col 70): POPULATE AS

Хм. POPULATE не работает с TO. См.

https://github.com/yandex/ClickHouse/blob/7bae3506c41be971ec6ec031c139f596e026a5f0/dbms/src/Parsers/ParserCreateQuery.cpp#L367

Легко обойти - можно просто INSERT ... SELECT сделать перед созданием матвью

Но действительно наверное несколько нелогично, по крайней мере должно быть какое-то внятное сообщение об ошибке.

I hit just this issue, too: MATERIALIZED VIEW ... TO <target> POPULATE throws an error. The SQL script is part of a migration, and the underlying table already contains a lot of data. Is there a way to trigger a POPULATE in a separate query? I didn't quite understand your "Легко обойти - можно просто INSERT ... SELECT сделать перед созданием матвью" advice to bad translation.

EDIT
Alright, I figured it works like this:
INSERT INTO materialized_view SELECT [select stmt from mat. view definition]

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

Was this page helpful?
0 / 5 - 0 ratings