2015-04-11 3 views
0

Я дал запрос, совместимый с teradata. Он импортировал таблицу в size_tab, используя Sqoop. Пытался выполнить на ВИЧ, но, к сожалению, совместим с улей.GROUPING() в улье?

SELECT fact_1_id, 
     fact_2_id, 
     SUM(sales_value) AS sales_value, 
     GROUPING(fact_1_id) AS f1g, 
     GROUPING(fact_2_id) AS f2g 
FROM dimension_tab 
GROUP BY CUBE (fact_1_id, fact_2_id) 
ORDER BY fact_1_id, fact_2_id; 

Затем я попытался сделать его совместимым с ВИЧ. См: WIKI

К счастью, CUBE доступен в энцефалопатии, но с другим синтаксисом

т.е. fact_1_id, fact_2_id С CUBE. но форма документации, GROUPING() недоступна в HIVE.

Пожалуйста, помогите мне, если функция GROUPING() доступна в HIVE. или Как сделать запрос на работу с HIVE?

ответ

0

Если вы не имеете NULL значения для id, просто использовать простую логику:

SELECT fact_1_id, 
     fact_2_id, 
     SUM(sales_value) AS sales_value, 
     (case when fact_1_id is null then 1 else 0 end) as f1g, 
     (case when fact_2_id is null then 1 else 0 end) as f2 
FROM dimension_tab 
GROUP BY fact_1_id, fact_2_id WITH CUBE 
ORDER BY fact_1_id, fact_2_id; 

Эта логика (не WITH CUBE, конечно) будет работать в обоих Teradata и улья.

В противном случае, если у вас есть пустые значения, вы можете использовать GROUPING__ID:

SELECT fact_1_id, 
     fact_2_id, 
     SUM(sales_value) AS sales_value, 
     (case when (CAST (GROUPING__ID AS INT) & 1) = 0 then 1 else 0 end) as f1g, 
     (case when (CAST (GROUPING__ID AS INT) & 2) = 0 then 1 else 0 end) as f2g 
FROM dimension_tab 
GROUP BY fact_1_id, fact_2_id WITH CUBE 
ORDER BY fact_1_id, fact_2_id; 

Примечание: GROUPING__ID зависит от порядка выражений в group by, так перестраивая group by может изменить значение флага ,

+0

Спасибо @ Gordon .... за подробный ответ. просто чтобы подтвердить, правильно ли я .. Даже если изменения порядка ... нам нужно изменить '& N' соответственно и будет отлично во всех случаях. – Sanjiv

+1

@Sanjiv. , , Значение «N» после '&' равно 2^позиции выражения в 'group by'. Почему Hive не просто поступил правильно и создал функцию 'grouping()', я не знаю. Компилятор SQL должен знать порядок выражений 'group by'. –

+0

Да, поднял HIVE JIRA за то же самое. https://issues.apache.org/jira/browse/HIVE-10310 – Sanjiv