Ответ 1
Согласно https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select:
"Hive не поддерживает IN, EXISTS или подзапросы в предложении WHERE.
Вы можете посмотреть: https://issues.apache.org/jira/browse/HIVE-801
Как я могу использовать предложение 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
Согласно https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select:
"Hive не поддерживает IN, EXISTS или подзапросы в предложении WHERE.
Вы можете посмотреть: https://issues.apache.org/jira/browse/HIVE-801
Вы можете использовать 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)
Улей 0.13 теперь поддерживают IN/EXISTS в предложении WHERE. Проблема https://issues.apache.org/jira/browse/HIVE-784 была решена через 4 года:)
Я использую версию hive 0.7.1
и SELECT * FROM MYTABLE WHERE MYCOLUMN IN ('thisThing','thatThing');
Я тестировал это по типу столбца STRING
, поэтому я не уверен, что это работает повсеместно по всем типам данных, поскольку я заметил, как упомянутый выше Wawrzyniec сказал, что в Руководстве по языку улья сказано, что оно не поддерживается и вместо этого используется LEFT SEMI JOIN
но он отлично работал в моем тесте.
Hive отлично поддерживает IN... он не поддерживает подзапрос в предложении WHERE
есть открытый билет функции от инженеров Facebook с 4 лет... https://issues.apache.org/jira/browse/HIVE-784?focusedCommentId=13579059
предположим 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;