Задать вопрос
@gibigate

Правильное создание таблицы в clickhouse?

Здравствуйте,

Только начал разбираться с yandex clickhouse, появилась задача хранения статистики посещения разных стран

Создал такую таблицу:
CREATE TABLE IF NOT EXISTS hits (
        event_date Date DEFAULT toDate(now()),
        page_id Int32,
        country FixedString(2),
        is_private Int8,
        views Int32,
        rating Int32,
        rating_amount Int32
    )
    ENGINE = SummingMergeTree(event_date, (page_id, country, is_private, event_date), 8192)


И даже начал сохранять статистику, но при выборке не могу получить то, что необходимо, а именно:
Получить page_id отсортированные по views из определенной страны за месяц

В документации есть правила создания таблиц:
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = SummingMergeTree([columns])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]


При попытке добавить PARTITION BY, ORDER BY натыкаюсь на ошибку:
Fatal error: Uncaught ClickHouseDB\Exception\DatabaseException: With extended storage definition syntax storage SummingMergeTree requires 0 to 1 parameters:
list of columns to sum]


Подскажите какой движок таблицы выбрать и правильную схему создания?
  • Вопрос задан
  • 2305 просмотров
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ответы на вопрос 1
Движок SummingMergeTree при слиянии кусков данных с одинаковым ключом сортировки заменяет на одну, которая хранит только суммы значений из столбцов с цифровым типом данных.

CREATE TABLE IF NOT EXISTS hits (
        event_date Date DEFAULT toDate(now()),
        page_id Int32,
        country FixedString(2),
        is_private Int8,
        views Int32,
        rating Int32,
        rating_amount Int32
    )
    engine = SummingMergeTree PARTITION BY toYYYYMM(event_date)
        ORDER BY (event_date, page_id, country, is_private)
        SETTINGS index_granularity = 8192;


В этом случае при слиянии кусков, поля views, rating, rating_amount будут суммироваться.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы