default.src (
date Date,
datetime DateTime,
userId UInt64,
countryId UInt8,
typeId UInt8
) ENGINE = MergeTree(date, (userId, datetime), 8192)
CREATE MATERIALIZED VIEW default.src_country
(
date Date,
datetime DateTime,
userId UInt64,
recordsByCountryMap Nested(
countryId UInt8,
records UInt64
)
)
ENGINE = SummingMergeTree(date, (date, datetime, userId), 8192)
AS
SELECT
date,
toStartOfMinute(datetime) AS datetime,
userId,
[countryId] as recordsByCountryMap.countryId,
[count()] AS recordsByCountryMap.records
FROM default.src
GROUP BY
date,
datetime,
userId,
countryId
В документации движка SummingMergeTree указано, что производится суммирование для столбцов заканчивающихся на 'Map'.
Но если данные вставлены в разных пачках, то их суммирует только optimize либо они сами "когда-то" просуммируются.
Вопрос - есть ли агрегирующая функция, которая сложит соотвествующие значения по ключам? Или до-агрегацию в таком случае производить на стороне клиента в коде?
Пример:
SELECT *
FROM src_country
┌───────date─┬────────────datetime─┬─userId─┬─recordsByCountryMap.countryId─┬─recordsByCountryMap.records─┐
│ 2017-01-01 │ 2017-01-01 00:00:00 │ 1 │ [10] │ [4] │
└────────────┴─────────────────────┴────────┴───────────────────────────────┴─────────────────────────────┘
┌───────date─┬────────────datetime─┬─userId─┬─recordsByCountryMap.countryId─┬─recordsByCountryMap.records─┐
│ 2017-01-01 │ 2017-01-01 00:00:00 │ 1 │ [10] │ [4] │
└────────────┴─────────────────────┴────────┴───────────────────────────────┴─────────────────────────────┘
┌───────date─┬────────────datetime─┬─userId─┬─recordsByCountryMap.countryId─┬─recordsByCountryMap.records─┐
│ 2017-01-01 │ 2017-01-01 00:00:00 │ 1 │ [10,11] │ [4,3] │
└────────────┴─────────────────────┴────────┴───────────────────────────────┴─────────────────────────────┘
SELECT
datetime,
groupArray(recordsByCountryMap.countryId),
groupArray(recordsByCountryMap.records)
FROM src_country
WHERE userId = 1
GROUP BY datetime
┌────────────datetime─┬─groupArray(recordsByCountryMap.countryId)─┬─groupArray(recordsByCountryMap.records)─┐
│ 2017-01-01 00:00:00 │ [[10],[10],[10,11]] │ [[4],[4],[4,3]] │
└─────────────────────┴───────────────────────────────────────────┴─────────────────────────────────────────┘
@milovidov_an можете с этим помочь? Нашел в исходниках хитрый *ForEach модификатор, попробовал с sumForEach, делает почти то, что нужно, но вероятно не учитывает по каким ключам происходит суммирование. Смотрел также на groupArrayInsertAt, sequenceMatch но похоже не то.
Обсуждают сегодня