web-dev-qa-db-fra.com

Gestion des valeurs NULL dans Hive

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

10
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.)

20
ruakh

Essayez d'inclure une longueur> 0 également.

column1 is not NULL AND column1 <> '' AND length(column1) > 0 
5
ShikharDua

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. 

2
Jickson T George

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.

1
LxsScarredCrest

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         |
+-----------+--+
0
camash

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 <> '';
0
Indrajeet Gour