J'essaie de créer une table (table 2) dans Hive à partir d'une autre table (table 1). J'essaie d'exclure certaines lignes avec des valeurs NULL et j'ai essayé la condition suivante.
insert overwrite table table2 partition (date = '2013-06-01')
select column1, column 2....
from table1
where column1 is not NULL or column1 <> '';
Cependant, lorsque j'essaie cette requête suivante avec la nouvelle table, j'ai 300+ lignes avec des valeurs NULL:
select count(*) from table2 where column1 is NULL;
Quelqu'un pourrait-il indiquer la cause de ces valeurs NULL?
Je vous remercie.
Ravi
Premièrement - je ne pense pas que column1 is not NULL or column1 <> ''
ait beaucoup de sens. Peut-être que vous vouliez écrire column1 is not NULL and column1 <> ''
(AND
au lieu de OR
)?
Deuxièmement - en raison de l'approche de "schéma en lecture" de Hive pour les définitions de table, les valeurs non valides seront converties en NULL
lorsque vous les lirez. Ainsi, par exemple, si table1.column1
est de type STRING
et table2.column1
est de type INT
, alors je ne pense pas que table1.column1 IS NOT NULL
soit suffisant pour garantir que table2.column1 IS NOT NULL
. (Je ne suis pas sûr à ce sujet, cependant.)
Essayez d'inclure une longueur> 0 également.
column1 is not NULL AND column1 <> '' AND length(column1) > 0
Quel est le type de données pour column1 dans votre table Hive? Notez que si votre colonne est STRING, elle n'aura pas de valeur NULL même si votre fichier externe ne contient aucune donnée pour cette colonne.
Essayez d’utiliser isnull (a), isnotnull (a), nvl (), etc. Sur certaines versions (éventuellement en conjonction avec les paramètres du serveur - du moins avec celui sur lequel je travaille) de Hive the 'IS NULL' et 'IS NOT La syntaxe NULL 'n'exécute pas la logique lors de la compilation. Vérifiez ici pour plus d'informations.
J'utilise ci-dessous SQL pour exclure la chaîne null et les lignes de chaîne vides.
select * from table where length(nvl(column1,0))>0
Parce que la longueur de la chaîne vide est 0.
select length('');
+-----------+--+
| length() |
+-----------+--+
| 0 |
+-----------+--+
Pour vérifier les donnéesNULLdata de column1 et considérer que le type de données dont il s'agit est String, vous pouvez utiliser la commande ci-dessous:
select * from tbl_name where column1 is null or column1 <> '';