2013-05-29 2 views
2

Hive поддерживает условные операторы - https://cwiki.apache.org/Hive/languagemanual-udf.html#LanguageManualUDF-ConditionalFunctionsБлок заявления в случае, иначе

Однако, я хотел бы использовать блок условных операторов. Например, у меня есть две таблицы A и B, имеющие похожие столбцы (хотя имена столбцов не идентичны). Я хочу создать новую таблицу из A и B, чтобы B имел более высокий приоритет. Таким образом, если строка присутствует в В, Я хотел бы выбрать его из B, то выбрать строку из A. т.е.

SELECT 
IF (B.id<>NULL, 
     (B.id as id, 
     B.value1 as value), 
     (A.id as id, 
     a.value2 as value)) 
FROM A FULL OUTER JOIN B ON (A.id = B.id) 

Этот запрос не работает. Это потому, что Hive не поддерживает условные выражения блока? Как я могу реализовать вышеуказанные функции?

ответ

4

я не знал бы о блочных условных операторов, но не это достичь того же:

select case when b.id is null then a.id else b.id end as id, 
     case when b.id is null then a.value else b.value end as value 
from a 
full outer join b on (a.id = b.id) 
+0

Да, это правильно. Я тоже придумал это. Проблема в том, что около 10 столбцов. Мне было интересно, есть ли элегантный способ написать это, а не использовать 10 case-заявлений. Благодаря! – elexhobby

+0

Вы также можете посмотреть тип структуры Hive(), чтобы вы могли просто использовать один оператор case: select case, когда b.id равно null, тогда struct (a.id, a.value) else struct (b.id, b.value) end как id_val ... хотя тогда вы также захотите ответить на мой вопрос здесь: http://stackoverflow.com/questions/16737914/is-there-a-tidier-syntax-for-convert-a-hive -struct-спина к регулярным-столбцам – patricksurry