2017-02-10 32 views
2

При выполнении контрольных показателей между Impala и PrestoDB мы заметили, что в Имапале довольно сложно построить сводные таблицы, потому что у нее нет операторов Cube, как это делает Presto. Вот два примера в Presto:Операторы куба на Impala

Оператор CUBE генерирует все возможные комплекты группировки (т. Е. Набор мощности) для заданного набора столбцов. Например, запрос: `

SELECT origin_state, destination_state, sum(package_weight) 
FROM shipping 
GROUP BY CUBE (origin_state, destination_state); 

эквивалентно:

SELECT origin_state, destination_state, sum(package_weight) 
FROM shipping 
GROUP BY GROUPING SETS (
(origin_state, destination_state), 
(origin_state), 
(destination_state), 
()); 

Другим примером является ROLLUP оператором. Полная документация находится здесь: https://prestodb.io/docs/current/sql/select.html.

Это не синтаксический сахар, потому что PRESTO выполняет одно сканирование таблицы для всего запроса - поэтому, используя эти операторы, вы можете создавать сводную таблицу в одном запросе. Импала должна запускать 2-3 запроса.

Есть ли способ, которым мы можем сделать это с помощью одного запроса/таблицы-сканирования в Impala instaead 3? В противном случае производительность становится ужасной при создании любого типа сводной таблицы.

ответ

1

Мы можем использовать функции impala windo, но вместо вывода одного столбца вы получите 3 столбца.

SELECT origin_state, 
     destination_state, 
     SUM(package_weight) OVER (PARTITION BY origin_state, destination_state) AS pkgwgrbyorganddest, 
     SUM(package_weight) OVER (PARTITION BY origin_state) AS pkgwgrbyorg, 
     SUM(package_weight) OVER (PARTITION BY destination_state) AS pkgwgrbydest 
FROM shipping; 
+0

я не уверен, что погода это поможет вам или нет, но вы получите представление об аналитических функциях –

+0

ссылка: https: //www.cloudera.com/documentation/enterprise/5-6-x/topics/ impala_analytic_functions.html # над –