Можем ли мы сделать свертку или куб без взрывающихся строк в улье / искре - PullRequest
0 голосов
/ 09 мая 2019

Я собираю 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 проходов).

Так что мне интересно, может ли улей / искра встроить это правило, или люди обычно решают эту проблему, в противном случае я не знаю?

1 Ответ

0 голосов
/ 09 мая 2019

Нет, Spark-SQL Catalyst не имеет никаких правил для расчета предварительных агрегатов. Это связано с тем, что ни каталог hcatalogue, ни каталог spark-sql не хранят информацию об иерархии, и поэтому на данный момент у него не будет этой функциональности.

Обычно инструменты OLAP предоставляют эту функциональность. Они хранят детали иерархии и на основе иерархии вычисляют агрегаты в кубе OLAP.

Если вы ищете функциональные возможности OLAP, то, вероятно, вам следует изучить Снежинка или Kyvosinsights

...