85 votes

Comment afficher les résultats d'une requête HiveQL au format CSV ?

Nous aimerions mettre les résultats d'une requête Hive dans un fichier CSV. Je pensais que la commande devait ressembler à ceci :

insert overwrite directory '/home/output.csv' select books from table;

Lorsque je l'exécute, il indique qu'il s'est terminé avec succès, mais je ne parviens pas à trouver le fichier. Comment puis-je trouver ce fichier ou dois-je extraire les données d'une autre manière ?

148voto

Lukas Vermeer Points 1190

Bien qu'il soit possible d'utiliser INSERT OVERWRITE pour extraire des données de Hive, ce n'est peut-être pas la meilleure méthode pour votre cas particulier. Permettez-moi tout d'abord d'expliquer ce qu'est un INSERT OVERWRITE puis je décrirai la méthode que j'utilise pour obtenir des fichiers tsv à partir de tables Hive.

Selon le le manuel votre requête stockera les données dans un répertoire de HDFS. Le format ne sera pas csv.

Les données écrites dans le système de fichiers sont sérialisées sous forme de texte dont les colonnes sont séparées par des ^A et les lignes par des retours à la ligne. Si l'une des colonnes n'est pas de type primitif, elle est sérialisée au format JSON.

Une légère modification (ajout de l'élément LOCAL ) stocke les données dans un répertoire local.

INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;

Lorsque j'exécute une requête similaire, voici à quoi ressemble le résultat.

[lvermeer@hadoop temp]$ ll
total 4
-rwxr-xr-x 1 lvermeer users 811 Aug  9 09:21 000000_0
[lvermeer@hadoop temp]$ head 000000_0 
"row1""col1"1234"col3"1234FALSE
"row2""col1"5678"col3"5678TRUE

Personnellement, j'ai l'habitude d'exécuter ma requête directement à travers Hive sur la ligne de commande pour ce genre de choses, et de l'envoyer dans le fichier local comme suit :

hive -e 'select books from table' > /home/lvermeer/temp.tsv

Cela me donne un fichier séparé par des tabulations que je peux utiliser. J'espère que cela vous sera utile.

Sur la base de ce patch-3682 Je pense qu'une meilleure solution est disponible avec Hive 0.11, mais je ne suis pas en mesure de la tester moi-même. La nouvelle syntaxe devrait permettre ce qui suit.

INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
select books from table;

J'espère que cela vous aidera.

25voto

Si vous voulez un fichier CSV, vous pouvez modifier les solutions de Lukas comme suit (en supposant que vous êtes sur une machine linux) :

hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv

7voto

C'est le moyen le plus convivial que j'ai trouvé pour sortir les résultats de HiveQL.
Vous n'avez pas besoin de commandes grep ou sed pour formater les données, hive le prend en charge, il suffit d'ajouter une balise supplémentaire de format de sortie.

hive --outputformat=csv2 -e 'select * from <table_name> limit 20' > /path/toStore/data/results.csv

4voto

Olaf Points 4910

Vous devez utiliser l'instruction CREATE TABLE AS SELECT (CTAS) pour créer un répertoire dans HDFS avec les fichiers contenant les résultats de la requête. Ensuite, vous devrez exporter ces fichiers de HDFS vers votre disque ordinaire et les fusionner en un seul fichier.

Il se peut également que vous deviez faire quelques manipulations pour convertir les fichiers de ' \001 ' - délimité en CSV. Vous pouvez utiliser un SerDe CSV personnalisé ou post-traiter le fichier extrait.

4voto

Vous pouvez utiliser INSERT DIRECTORY , comme dans cet exemple :

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
SELECT name, salary, address
FROM employees
WHERE se.state = 'CA';

OVERWRITE y LOCAL ont les mêmes interprétations que précédemment et les chemins sont interprétés selon les règles habituelles. Un ou plusieurs fichiers seront écrits dans /tmp/ca_employees en fonction du nombre de réducteurs invoqués.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X