Как писать подзапрос и использовать "В" в улье

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

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

Спасибо и с уважением, Atul

Ответы

Ответ 2

Вы можете использовать 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-clause), но не в 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)

Ответ 4

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

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

Ответ 6

предположим 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;