Как я могу выполнить INSERT OVERWRITE для таблицы X, если X пуст с помощью Hive? - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь вставить некоторые значения в таблицу X с разделами на основе столбца cx, если X пусто.Я пытаюсь использовать такой запрос:

INSERT OVERWRITE TABLE X PARITION(cx) 
SELECT DISTINCT ... 
WHERE ... OR NOT EXISTS(SELECT cx2 FROM X LIMIT 1)

Но я получаю следующую ошибку при запуске этого кода:

Error while compiling statement: FAILED: SemanticException [Error 10249]:
line 18:131 Unsupported SubQuery Expression '1': Only SubQuery expressions
that are top level conjuncts are allowed

Есть ли другая альтернатива, которую я могу использовать, чтобы получитьтакое же ожидаемое поведение при использовании только SQL Hive?

1 Ответ

0 голосов
/ 22 октября 2018

EXISTS в улье должно быть коррелировано .Вот так

select * from a
where EXISTS (select 1 from x where x.col=a.col) --correlated condition

То же, что вы можете достичь с помощью объединений (предположим, ключ объединения не дублирует):

--checking NOT EXISTS
select * from a
         left join X on x.col=a.col  --same condition like in correlated EXISTS  query
where x.col is null --not exists

--checking EXISTS can be done using INNER JOIN:
select * from a 
         inner join x on x.col=a.col --same condition like in correlated EXISTS query

--checking EXISTS can be done using LEFT SEMI JOIN:
select * from a 
         left semi join x on x.col=a.col

--Insert into table X only if partition is empty (JOIN):
insert overwrite table X partition(p)
select col1, col2, p--partition col
  from Y 
        left join (select distinct p from X) x1 on y.p=x1.p
 where x1.p is null

--Insert into table X only if partition is empty (EXISTS):
insert overwrite table X partition(p)
select col1, col2, p--partition col
  from Y 
        WHERE NOT EXISTS (select 1 from X x1 where x1.p=Y.p) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...