web-dev-qa-db-fra.com

Existe-t-il un équivalent Hive de SQL "pas comme"

Alors que Hive prend en charge les requêtes positives comme: ex.

sélectionnez * dans nom_table où nom_colonne comme 'root ~%';

Hive ne fonctionne pas supporte les requêtes de type négatif: ex.

sélectionnez * dans nom_table où nom_colonne pas comme 'root ~%';

Quelqu'un connaît-il une solution équivalente prise en charge par Hive?

24
CMaury

Consultez https://cwiki.Apache.org/confluence/display/Hive/LanguageManual si vous ne l'avez pas fait. Je le référence tout le temps lorsque j'écris des requêtes pour Hive.

Je n'ai rien fait où j'essaie de faire correspondre une partie d'un mot, mais vous pouvez vérifier RLIKE (dans cette section https://cwiki.Apache.org/confluence/display/Hive/LanguageManual + UDF # Relational_Operators )

C'est probablement un peu un travail de piratage, mais vous pouvez faire une sous-requête où vous vérifiez si elle correspond à la valeur positive et faites un CASE ( http://wiki.Apache.org/ hadoop/Hive/LanguageManual/UDF # Conditional_Functions ) pour avoir une valeur connue pour la requête principale à vérifier pour voir si elle correspond ou non.

Une autre option consiste à écrire un UDF qui effectue la vérification.

Je fais juste un remue-méninges en étant assis à la maison sans accès à Hive, donc je manque peut-être quelque chose d'évident. :)

J'espère que cela aide d'une manière ou d'une autre.\^ _ ^ /

EDIT: Ajout d'une méthode supplémentaire à partir de mon commentaire ci-dessous.

Pour votre exemple fourni colName RLIKE '[^ r] [^ o] [^ o] [^ t] ~\w' Ce n'est peut-être pas le REGEX optimal, mais quelque chose à examiner au lieu de sous-requêtes

3
QuinnG

Essaye ça:

Where Not (Col_Name like '%whatever%')

fonctionne également avec rlike:

Where Not (Col_Name rlike '.*whatever.*')
48
HAL9000

NOT LIKE ont été pris en charge dans la version 0.8.0 de Hive, consultez JIRA.

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

8
Sanjiv

En SQL:

select * from table_name where column_name not like '%something%';

Dans la ruche:

select * from table_name where not (column_name like '%something%');
5
minhas23

L'utilisation de regexp_extract fonctionne également:

select * from table_name where regexp_extract(my_column, ('myword'), 0) = ''
1
Reid Minto

Dans impala, vous pouvez utiliser != pour pas comme:

columnname != value
0
DrSD

En fait, vous pouvez le faire comme ceci:

select * from table_name where not column_name like 'root~%';
0
zorro