2015-02-19 4 views
1

В таблице A у меня есть даты от 2014-01-01 до 2014-12-31HIVE для каждой строки из одной таблицы объединить все строки из другой таблицы

action_date 
2014-01-01 
2014-01-02 
2014-01-03 
... 
2014-12-31 

В таблице B У меня есть информация, как

id name action_date deletion_date 
1 nik 2013-01-01 2014-02-03 
2 tom 2014-06-02 2014-06-30 
3 lola 2013-12-30 2014-01-01 
4 pete 2014-12-29 1970-01-01 

Я хочу для объединения строк из таблицы B в каждую таблицу строк A, если activation_date<=action_date AND (action_date<=deletion_date OR deletion_date='1970-01-01')

e .г.

action_date id name action_date deletion_date 
2014-01-01 1 nik 2013-01-01 2014-02-03 
2014-01-01 3 lola 2013-12-30 2014-01-01 
2014-01-02 1 nik 2013-01-01 2014-02-03 
2014-01-03 1 nik 2013-01-01 2014-02-03 
    [...] 
2014-02-03 1 nik 2013-01-01 2014-02-03 

2014-06-02 2 tom 2014-06-02 2014-06-30 
2014-06-03 2 tom 2014-06-02 2014-06-30 
    [...] 
2014-06-03 2 tom 2014-06-02 2014-06-30 
2014-12-29 4 pete 2014-12-29 1970-01-01 
2014-12-30 4 pete 2014-12-29 1970-01-01 
2014-12-31 4 pete 2014-12-29 1970-01-01 

Я попытался использовать следующий запрос в Hive и PostgreSQL.

SELECT a.action_date, b.* 
    FROM b 
    JOIN a ON action_date>= activation_date 
      AND (action_date<=deletion_date OR deletion_date='1970-01-01') 

В PostgreSQL он работает отлично, но в улье возвращает semanticexception [error 10017]: line 16:3 both left and right aliases encountered in join 'action_date'

Как решить эту проблему в улье?

+0

Вместо использования условий <= and > = внутри предложения ON вы можете использовать WHERE для [фильтрации] [1]. выбрать. *, T3. * От A t3 РЕГИСТРИРУЙТЕСЬ В v3 ВКЛ (v3.id = t3.no) ГДЕ v3.sdate <= t3.actualdate И v3.edate> = t3.actualdate [1]: http://stackoverflow.com/questions/25832513/how-to-join-two-tables-in-hive –

+0

@ Mus7afa, Тогда какое условие должно использоваться в заявлении ON? – Marta

+0

проверьте ваш запрос, «ON action_date> = activ_date», вы ошибаетесь в этой строке. это должно быть «ON action_date = activation_date». SELECT a.action_date, b. * FROM b JOIN a ON (a. Action_date = b. Action_date) WHERE b.action_date <= b.deletion_date ИЛИ b.deletion_date = '1970-01-01'. и вы можете использовать «ON (TRUE)», но это может быть медленным. –

ответ

0

В соответствии с ошибкой выпуск возникает из-за того же имени столбца в обеих таблицах. Используйте псевдоним для таблиц и условия, укажите псевдоним. Это решит проблему.

Смежные вопросы