Hive: несколько In-элементов с одним подзапросом

Я пытался выполнить такой запрос в улье (версия 1.2.1):

DELETE  FROM employee as e WHERE  (e.id, e.name) IN ( SELECT emp.id, emp.name FROM employee_final  emp) AND e.sno = 120 ;

Но поскольку улей не поддерживает эту конструкцию, я попробовал следующее:

DELETE FROM employee WHERE 
id  IN (  SELECT emp.id  FROM employee_final AS  emp ) 
AND 
name IN ( SELECT emp.name  FROM employee_final AS  emp      )  
AND e.sno = 120 ;

Но похоже, что в улье есть ограничение, и он поддерживает только 1 подзапрос, и я получаю подобное исключение

Сообщение об ошибке: Грамматически неверный запрос SQL:]; вложенное исключение - org.apache.hive.service.cli.HiveSQLException: Ошибка при компиляции оператора: FAILED: SemanticException [Ошибка 10249]: Строка 1: 185 Неподдерживаемое выражение подзапроса «имя»: поддерживается только 1 выражение подзапроса.

Как лучше всего справиться с этой проблемой.


person Piyush Dixit    schedule 18.01.2016    source источник


Ответы (1)


Вы можете попробовать следующее

  1. через EXISTS Я не уверен, что эта форма для подзапроса поддерживается в HIVE.

    DELETE FROM employee as e WHERE EXISTS ( SELECT 1 FROM employee_final emp where e.id = emp.id and e.name =  emp.name ) AND e.sno = 120 ;
    
  2. через функцию CONCAT

    DELETE FROM employee as e WHERE concat (e.id, '#' ,e.name) IN ( SELECT concat (emp.id,'#' ,emp.name) FROM employee_final emp) AND e.sno = 120 ;
    
person Sanjiv    schedule 18.01.2016
comment
Функция CONCAT полезна только в том случае, если 1 из столбцов является первичным ключом таблицы. Так как это обеспечит уникальность. - person Piyush Dixit; 18.01.2016
comment
Вам не нужен первичный ключ для того же - person Sanjiv; 19.01.2016