web-dev-qa-db-fra.com

obtenir des valeurs nulles lors du chargement des données à partir de fichiers plats dans des tables Hive

Je reçois les valeurs nulles lors du chargement des données à partir de fichiers plats dans des tables Hive.
la structure de mes tables est la suivante:

Hive> create table test_Hive (id int,value string);

et mon fichier plat est comme ceci: input.txt

1   a
2   b
3   c
4   d
5   e
6   F
7   G
8   j

lorsque j'exécute les commandes ci-dessous, j'obtiens des valeurs nulles:

Hive> LOAD DATA LOCAL INPATH '/home/hduser/input.txt' OVERWRITE INTO TABLE test_Hive;
Hive> select * from test_Hive;
OK<br>
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL

capture d'écran:

Hive> create table test_Hive (id int,value string);
OK
Time taken: 4.97 seconds
Hive> show tables;
OK
test_Hive
Time taken: 0.124 seconds
Hive> LOAD DATA LOCAL INPATH '/home/hduser/input2.txt' OVERWRITE INTO TABLE test_Hive;
Copying data from file:/home/hduser/input2.txt
Copying file: file:/home/hduser/input2.txt
Loading data to table default.test_Hive
Deleted hdfs://hydhtc227141d:54310/app/Hive/warehouse/test_Hive
OK
Time taken: 0.572 seconds
Hive> select * from test_Hive;
OK
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
Time taken: 0.182 seconds
15
user1823697

Le terminateur de champ par défaut dans Hive est ^ A. Vous devez mentionner explicitement dans votre instruction create table que vous utilisez un séparateur de champ différent.

Semblable à ce que Lorand Bending a souligné dans le commentaire, utilisez:

CREATE TABLE test_Hive(id INT, value STRING) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';

Vous n'avez pas besoin de spécifier un emplacement puisque vous créez une table gérée (et non une table externe).

19
Mark Grover

Le problème que vous rencontrez est dû au fait que dans vos données, les champs sont séparés par un '' et lors de la création du tableau, vous n'avez pas mentionné le délimiteur de champ. Ainsi, si vous ne mentionnez pas le délimiteur de champ lors de la création de la table Hive, par défaut, Hive considère que ^ A est un délimiteur.

Donc, pour résoudre votre problème, vous pouvez recréer le tableau en mentionnant la syntaxe ci-dessous et cela fonctionnerait.

CREATE TABLE test_Hive(id INT, value STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';

6
Mufaddal Kamdar

Liste des délimiteurs d’enregistrements et de champs par défaut de Hive:

  1. \ n

  2. ^ Un

  3. ^ B

  4. ^ C

appuyez sur ^ V ^ A pourrait insérer un ^ A dans Vim.

1
songhir

La solution est assez simple. La table n'a pas été créée de la bonne manière. 

Une solution simple à votre problème ou à d’autres problèmes est de savoir comment charger les données.

CREATE TABLE [SI NON EXIST] mytableName (id int, chaîne de valeur)

ROW FORMAT DELIMITED

Champs terminés par '/ t'

STOCKÉ COMME TEXTFILE;

Maintenant, je vous explique le code:

  1. Première ligne Création de votre table. Le paramètre [IF NOT EXIST] est facultatif. Il indique si la table existe, ne l'écrasez pas. C'est plus une mesure de sécurité.

  2. Deuxième ligne Spécifie un délimiteur au niveau de la table pour les champs structurés.

  3. Troisième élémentVous pouvez inclure n'importe quel caractère, mais la valeur par défaut est '\ 001' . '/ T' désigne un espace de tabulation: dans votre cas, '|' est pour les données qui sont côte à côte et séparées par | ' 'pour un espace de caractère. Etc...

  4. Forth Line: Spécifie le type de fichier dans lequel les données doivent être stockées. Le fichier peut être un fichier TEXTFILE, SEQUENCEFILE, RCFILE ou BINARY SEQUENCEFILE. Ou, la manière dont les données sont stockées peut être spécifiée en tant que classes d'entrée et de sortie Java. 

lors du chargement localement:

LOCD DATA LOCAL INPATH '/votre/data/path.csv' [OVERWRITE] INTO TABLE myNomTable;

Essayez toujours de vérifier vos données par une simple instruction select *.

J'espère que ça aide.

1
user 451

veuillez vérifier la colonne de date du jeu de données, elle doit suivre le format de date aaaa-mm-jj Si la chaîne est au format 'aaaa-mm-jj', une valeur de date correspondant à cette année/mois/jour est renvoyée. Si la valeur de chaîne ne correspond pas à ce format, alors NULL est renvoyé . Documentation officielle de Hive

1
Shekh Firoz Alam

Les éléments sont séparés par un espace ou une tabulation? Laisser son onglet suivre ces étapes. Si espace séparé, utilisez '' au lieu de '\ t' Ok. 

Hive> CREATE TABLE test_Hive(id INT, value STRING) row format
   delimited fields terminated by '\t' line formated by '\n' stored as filename;

Que vous devez entrer 

Hive> LOAD DATA LOCAL INPATH '/home/hduser/input.txt' OVERWRITE INTO TABLE test_Hive;

Hive> select * from test_Hive;

Maintenant, vous obtiendrez exactement votre résultat attendu "nom de fichier".

1
Venu A Positive