ClickHouse/docs/ru/table_engines/summingmergetree.md

3.7 KiB
Raw Blame History

SummingMergeTree

Отличается от MergeTree тем, что суммирует данные при слиянии.

SummingMergeTree(EventDate, (OrderID, EventDate, BannerID, ...), 8192)

Столбцы для суммирования заданы неявно. При слиянии, для всех строчек с одинаковым значением первичного ключа (в примере - OrderID, EventDate, BannerID, ...), производится суммирование значений в числовых столбцах, не входящих в первичный ключ.

SummingMergeTree(EventDate, (OrderID, EventDate, BannerID, ...), 8192, (Shows, Clicks, Cost, ...))

Явно заданные столбцы для суммирования (последний параметр - Shows, Clicks, Cost, ...). При слиянии, для всех строчек с одинаковым значением первичного ключа, производится суммирование значений в указанных столбцах. Указанные столбцы также должны быть числовыми и не входить в первичный ключ.

Если значения во всех таких столбцах оказались нулевыми, то строчка удаляется. (За исключением случаев, когда в куске данных не осталось бы ни одной строчки.)

Для остальных столбцов, не входящих в первичный ключ, при слиянии выбирается первое попавшееся значение.

При чтении, суммирование не делается само по себе. Если оно необходимо - напишите соответствующий GROUP BY.

Дополнительно, таблица может иметь вложенные структуры данных, которые обрабатываются особым образом. Если название вложенной таблицы заканчивается на Map и она содержит не менее двух столбцов, удовлетворяющих следующим критериям:

  • первый столбец - числовой ((U)IntN, Date, DateTime), назовем его условно key,
  • остальные столбцы - арифметические ((U)IntN, Float32/64), условно (values...), то такая вложенная таблица воспринимается как отображение key => (values...) и при слиянии ее строк выполняется слияние элементов двух множеств по key со сложением соответствующих (values...).

Примеры:

[(1, 100)] + [(2, 150)] -> [(1, 100), (2, 150)]
[(1, 100)] + [(1, 150)] -> [(1, 250)]
[(1, 100)] + [(1, 150), (2, 150)] -> [(1, 250), (2, 150)]
[(1, 100), (2, 150)] + [(1, -100)] -> [(2, 150)]

Для агрегации Map используйте функцию sumMap(key, value).

Для вложенных структур данных не нужно указывать её столбцы в качестве списка столбцов для суммирования.

Этот движок таблиц разработан по просьбе БК, и является мало полезным. Помните, что при хранении лишь предагрегированных данных, вы теряете часть преимуществ системы.