Как написать подзапрос и использовать предложение "In" в Hive - PullRequest
17 голосов
/ 06 октября 2011

Как я могу использовать пункт In в Hive Я хочу написать что-то подобное в Hive выберите x из y, где y.z в (выберите различный z из y) порядок x; Но я не нахожу никакого способа сделать это .. Я попытался В пункте в Улей 0.7 это было ошибкой броска, Также я попытался Find_in_Set .. используя find_in_set (y.z, подзапрос) .. но работа не удалась.

Я хочу сделать это в Улей. Пожалуйста, помогите мне, если кто-нибудь знает, как это сделать в Улей ..

Спасибо и С уважением, Атул

Ответы [ 7 ]

36 голосов
/ 15 февраля 2013

Вы можете использовать semi join (https://cwiki.apache.org/Hive/languagemanual-joins.html):

LEFT SEMI JOIN эффективно реализует коррелированную семантику подзапроса IN / EXISTS. Поскольку Hive в настоящее время не поддерживает подзапросы IN / EXISTS, вы можете переписать свои запросыиспользование LEFT SEMI JOIN. Ограничения использования LEFT SEMI JOIN состоят в том, что на таблицу правой стороны следует ссылаться только в условии соединения (предложение ON), но не в предложениях WHERE или SELECT и т. д.

SELECT a.key, a.value
  FROM a
  WHERE a.key in
   (SELECT b.key
    FROM B);

можно переписать в:

   SELECT a.key, a.val
   FROM a LEFT SEMI JOIN b on (a.key = b.key)
18 голосов
/ 17 апреля 2014

Улей 0.13 теперь поддерживает IN / EXISTS в предложении WHERE. Проблема https://issues.apache.org/jira/browse/HIVE-784 была решена через 4 года :)

7 голосов
/ 14 октября 2011

Согласно https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select:

"Hive не поддерживает IN, EXISTS или подзапросы в предложении WHERE."

Возможно, вы захотите посмотреть: https://issues.apache.org/jira/browse/HIVE-801

https://issues.apache.org/jira/browse/HIVE-1799

3 голосов
/ 04 апреля 2013

Я использую версию улья 0.7.1 и SELECT * FROM MYTABLE WHERE MYCOLUMN IN ('thisThing','thatThing');

Я проверил это на типе столбца STRING, поэтому я не уверен, работает ли это универсально на всех типах данных, так как я заметил, как Wawrzyniec упоминал выше, что Руководство по языку Hive говорит, что оно не поддерживается, и вместо этого использует LEFT SEMI JOIN но в моем тесте все работало нормально.

0 голосов
/ 09 мая 2018

Hive поддерживает операторы IN / EXISTS начиная с Hive 0.13 с небольшими ограничениями.Пожалуйста, обратитесь к https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SubQueries для более подробной информации.

0 голосов
/ 16 января 2016

предполагается table t1(id,name) и table t2(id,name)

перечисляет только те идентификаторы из t1, которые существуют в t2 (в основном IN предложение)

hive>select a.id from t1 a left semi join t2 b on (a.id=b.id);

перечисляет только те идентификаторы из t1, которые существуют только в t1, но не в t2 (в основном NOT IN предложение)

hive>select a.id from t1 a left outer join t2 b on(a.id=b.id) where b.id is null;
0 голосов
/ 15 февраля 2013

Hive отлично поддерживает IN ... он не поддерживает подзапрос в предложении WHERE

есть открытый билет от инженеров Facebook с 4 лет ... https://issues.apache.org/jira/browse/HIVE-784?focusedCommentId=13579059

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...