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
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).
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 ' ';
Liste des délimiteurs d’enregistrements et de champs par défaut de Hive:
\ n
^ Un
^ B
^ C
appuyez sur ^ V ^ A pourrait insérer un ^ A dans Vim.
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:
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é.
Deuxième ligne Spécifie un délimiteur au niveau de la table pour les champs structurés.
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...
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.
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
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".