web-dev-qa-db-fra.com

comment écrire une sous-requête et utiliser la clause "In" dans Hive

Comment puis-je utiliser la clause In dans Hive Je veux écrire quelque chose comme ceci dans Hive sélectionnez x de y où yz dans (sélectionnez z distinct de y), triez par ordre; x; Mais je ne trouve aucun moyen de le faire .. essayé Find_in_Set .. en utilisant find_in_set (yz, sous-requête) .. mais le travail échoue.

Je veux faire ça sur Hive. S'il vous plaît aidez-moi si quelqu'un sait comment faire cela dans la ruche ..

Merci et salutations, Atul 

16
user722856

Selon https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+Select :

"Hive ne prend pas en charge IN, EXISTS ou les sous-requêtes de la clause WHERE."

Vous voudrez peut-être regarder: https://issues.Apache.org/jira/browse/Hive-801

https://issues.Apache.org/jira/browse/Hive-1799

7
Luis R.

Vous pouvez utiliser semi join ( https://cwiki.Apache.org/Hive/languagemanual-joins.html ):

LEFT SEMI JOIN implémente la sémantique corrélée des sous-requêtes IN/EXISTS de manière efficace. Hive ne prenant actuellement pas en charge les sous-requêtes IN/EXISTS, vous pouvez réécrire vos requêtes à l'aide de LEFT SEMI JOIN. L'utilisation de LEFT SEMI JOIN est limitée par le fait que la table de droite ne doit être référencée que dans la condition de jointure (clause ON), mais pas dans les clauses WHERE ou SELECT, etc. 

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

peut être réécrit pour:

   SELECT a.key, a.val
   FROM a LEFT SEMI JOIN b on (a.key = b.key)
34
www

Hive 0.13 prend désormais en charge IN/EXISTS dans la clause WHERE .. Le problème https://issues.Apache.org/jira/browse/Hive-784 a été résolu après 4 ans :) 

18
Gaurav Kohli

J'utilise Hive version 0.7.1 et SELECT * FROM MYTABLE WHERE MYCOLUMN IN ('thisThing','thatThing'); 

J'ai testé cela sur un type de colonne STRING et je ne suis donc pas sûr que cela fonctionne de manière universelle sur tous les types de données car j'ai remarqué, comme Wawrzyniec l'a mentionné plus haut, que le manuel du langage Hive indique qu'il n'est pas pris en charge et qu'il utilise plutôt LEFT SEMI JOIN tester.

3
Engineiro

assumer table t1(id,name) et table t2(id,name)

répertoriant uniquement les identifiants de t1 qui existent dans le t2 (clause IN essentiellement)

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

répertoriant uniquement les identifiants de t1 qui existent uniquement dans t1 mais pas dans le t2 (clause NOT IN essentiellement)

Hive>select a.id from t1 a left outer join t2 b on(a.id=b.id) where b.id is null;
0
Azam Khan

Hive prend en charge les instructions IN/EXISTS depuis Hive 0.13 avec peu de limitations. Veuillez consulter https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+SubQueries pour plus de détails. 

0
Serg

Hive supporte parfaitement l'IN ... il ne supporte pas la sous-requête de la clause WHERE

les ingénieurs de Facebook proposent depuis 4 ans un ticket pour les fonctionnalités ouvertes ... https://issues.Apache.org/jira/browse/Hive-784?focusedCommentId=13579059

0
Guido Serra