2017-10-20 36 views
1

J'ai une table Ruche dans AWS nommé table1 avec une seule colonne, qui ressemble à ci-dessous:Hive filtrer automatiquement NULL dans NOT IN état

COL1 
(null) 
active 

Essayer ci-dessous requête

select * 
from table1 
where COL1 NOT IN ('reversed') 

Ruche est renvoyer une seule ligne

COL1 
active 

Pourquoi ne retourne-t-il pas l'enregistrement avec (null)? Je comprends que le correctif est de modifier la condition comme ci-dessous. Mais je veux déboguer ce problème afin que cela ne se produit pas sur d'autres requêtes

where coalesce(COL1,"") NOT IN ('reversed') 

Répondre

1

Voici comment traiter la valeur null tous les systèmes SGBDR.

null a une signification particulière - quelque chose comme not defined

Lorsque vous vérifiez:

COL1 NOT IN ('reversed') 

les comparaisons suivantes seront:

(null) != reversed 
active != reversed 
... 

et seuls ceux qui reviennent true seront retourné:

scala> spark.sql("SELECT 'active' != 'reversed'").show 
+-------------------------+ 
|(NOT (active = reversed))| 
+-------------------------+ 
|      true| 
+-------------------------+ 


scala> spark.sql("SELECT null != 'reversed'").show 
+---------------------------------------+ 
|(NOT (CAST(NULL AS STRING) = reversed))| 
+---------------------------------------+ 
|         null| 
+---------------------------------------+ 

comme vous pouvez le voir: (null) != 'reversed' ne retourne pas true - c'est pourquoi vous ne le voyez pas dans le jeu de résultats

De plus: A cause de cela, nous avons

scala> spark.sql("SELECT (null) = 'reversed'").show 
+---------------------------------+ 
|(CAST(NULL AS STRING) = reversed)| 
+---------------------------------+ 
|        null| 
+---------------------------------+ 

IS NULL, IS NOT NULL, COALESCE, etc méthodes et fonctions, qui nous permettent de travailler avec NULL valeurs

+0

Merci pour la clarification! Ça m'a aidé. – Neena