Я собираю 4 измерения в таблице кустов (десятки миллиардов строк), и их нужно свернуть или собрать в куб.Скажем, моя таблица посвящена взаимодействию пользователей, и я собираю данные о том, какое мобильное приложение они используют, какое мобильное устройство у них есть, и т. Д. SQL выглядит так:
select d1, d2, d3, d4, count(distinct userId) as uv, sum(1) as pv from T
group by cube(d1, d2, d3, d4)
Посколькутекущая реализация группирования множеств / rollup / cube разбивает ввод (в соответствии с этим jira ), в результате чего общее количество проходов по вводу составляет 16, что довольно затратно.
Мое собственное решение дляэто временная таблица, в которой я агрегирую сначала по идентификатору пользователя и четырем измерениям, а затем выполняю сведение.
create table tmp as
select userId, d1, d2, d3, d4, sum(1) as pv from T
group by userId, d1, d2, d3, d4
затем
select d1, d2, d3, d4, count(1) as uv, sum(pv) as pv
from tmp
group by cube(d1, d2, d3, d4)
Поскольку входные данные огромны, предварительная агрегация значительно сокращает время выполнения (сокращаявходные данные размером 16 проходов).
Так что мне интересно, может ли улей / искра встроить это правило, или люди обычно решают эту проблему, в противном случае я не знаю?