web-dev-qa-db-fra.com

Comment puis-je exporter 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 devrait ressembler à ceci:

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

Lorsque je l'exécute, il indique que le processus est terminé mais que je ne trouve jamais le fichier. Comment trouver ce fichier ou devrais-je extraire les données d'une manière différente?

Merci!

71
AAA

Bien qu'il soit possible d'utiliser INSERT OVERWRITE pour extraire des données de Hive, il se peut que ce ne soit pas la meilleure méthode pour votre cas particulier. Permettez-moi d’abord d’expliquer ce que fait INSERT OVERWRITE, puis de décrire la méthode que j’utilise pour obtenir des fichiers tsv à partir de tables Hive.

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

Les données écrites sur le système de fichiers sont sérialisées sous forme de texte avec des colonnes séparées par ^ A et des lignes séparées par des lignes. Si l'une des colonnes n'est pas de type primitif, ces colonnes sont sérialisées au format JSON.

Une légère modification (ajout du mot clé LOCAL) permettra de stocker 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, je lance habituellement ma requête directement via Hive sur la ligne de commande pour ce genre de chose, et la transfère dans le fichier local de la manière suivante:

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 également.

Sur la base de this patch-3682 , je soupçonne qu’une meilleure solution est disponible lors de l’utilisation de Hive 0.11, mais je suis incapable de le 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 pourra aider.

138
Lukas Vermeer

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

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

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. Après cela, vous devrez exporter ces fichiers de HDFS vers votre disque normal et les fusionner en un seul fichier.

Vous devrez peut-être aussi faire quelques astuces pour convertir les fichiers délimités en '\ 001' au format CSV. Vous pouvez utiliser un fichier CSV SerDe personnalisé ou post-traiter le fichier extrait.

4
Olaf

Si vous utilisez HUE, cela est également assez simple. Allez simplement dans l'éditeur Hive dans HUE, exécutez votre requête Hive, puis enregistrez le fichier de résultat localement au format XLS ou CSV, ou vous pouvez enregistrer le fichier de résultat sur HDFS.

3
Ray

Vous pouvez utiliser la fonction de chaîne Hive CONCAT_WS( string delimiter, string str1, string str2...strn )

pour ex:

Hive -e 'select CONCAT_WS(',',cola,colb,colc...,coln) from Mytable' > /home/user/Mycsv.csv
3
Ram Ghadiyaram

Je cherchais une solution similaire, mais celles mentionnées ici ne fonctionneraient pas. Mes données comportaient toutes les variantes d'espaces (espaces, nouvelles lignes, tabulations) et virgules. 

Pour sécuriser les données de colonne tsv, j'ai remplacé tous les caractères dans les données de colonne par un espace et exécuté du code python sur la ligne de commande pour générer un fichier csv, comme indiqué ci-dessous:

Hive -e 'tab_replaced_hql_query' |  python -c 'exec("import sys;import csv;reader = csv.reader(sys.stdin, dialect=csv.Excel_tab);writer = csv.writer(sys.stdout, dialect=csv.Excel)\nfor row in reader: writer.writerow(row)")'

Cela a créé un CSV parfaitement valide. J'espère que cela aide ceux qui viennent à la recherche de cette solution.

3
sisanared

J'ai eu un problème similaire et c'est ainsi que j'ai pu y remédier.

Étape 1 - Chargez les données de la table Hive dans une autre table comme suit

DROP TABLE IF EXISTS TestHiveTableCSV;
CREATE TABLE TestHiveTableCSV 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n' AS
SELECT Column List FROM TestHiveTable;

Étape 2 - Copiez le blob de l'entrepôt Hive vers le nouvel emplacement avec l'extension appropriée.

Start-AzureStorageBlobCopy
-DestContext $destContext 
-SrcContainer "Source Container"
-SrcBlob "Hive/warehouse/TestHiveTableCSV/000000_0"
-DestContainer "Destination Container"
-DestBlob "CSV/TestHiveTable.csv"
2
Dattatrey Sindol

Vous pouvez utiliser INSERTDIRECTORY…, comme dans cet exemple:

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

OVERWRITE et LOCAL ont les mêmes interprétations qu'auparavant 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.

2
bigmakers

Le séparateur par défaut est "^A". En langage python, c'est "\x01".

Quand je veux changer le délimiteur, j'utilise SQL comme:

SELECT col1, delimiter, col2, delimiter, col3, ..., FROM table

Ensuite, considérez le délimiteur + "^A" comme un nouveau délimiteur.

1
moshaholo

Je peux être en retard à celui-ci, mais aiderais avec la réponse:

echo "COL_NAME1 | COL_NAME2 | COL_NAME3 | COL_NAME4"> SAMPLE_Data.csv Hive -e 'sélectionne un concat distinct (COL_1, "|", COL_2, "|", COL_3, "|", COL_4) dans table_Name où clause si nécessaire;' >> SAMPLE_Data.csv

0
Anil Kumar K B

J'ai essayé diverses options, mais ce serait l'une des solutions les plus simples pour PythonPandas:

Hive -e 'select books from table' | grep "|" ' > temp.csv

df=pd.read_csv("temp.csv",sep='|')

Vous pouvez également utiliser tr "|" "," pour convertir "|" à ","

0
notilas

Cette commande Shell imprime le format de sortie au format csv dans output.txt sans les en-têtes de colonne.

$ Hive --outputformat=csv2 -f 'hivedatascript.hql' --hiveconf Hive.cli.print.header=false > output.txt
0
Hive  --outputformat=csv2 -e "select * from yourtable" > my_file.csv

ou

Hive  --outputformat=csv2 -e "select * from yourtable" > [your_path]/file_name.csv

Pour tsv, remplacez csv par tsv dans les requêtes ci-dessus et exécutez vos requêtes.

0
Terminator17

Si vous le faites sous Windows, vous pouvez utiliser le script Python hivehoney pour extraire les données de la table dans un fichier CSV local.

Ce sera:

  1. Connectez-vous à l'hôte bastion. 
  2. pbrun. 
  3. kinit. 
  4. beeline (avec votre requête). 
  5. Enregistrez l’écho de beeline dans un fichier sous Windows.

Exécutez-le comme ceci:

set PROXY_Host=your_bastion_Host

set SERVICE_USER=you_func_user

set LINUX_USER=your_SOID

set LINUX_PWD=your_pwd

python hh.py --query_file=query.sql
0
Alex B

Juste pour couvrir davantage d’étapes suivantes après le lancement de la requête: INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select books from table;

Dans mon cas, les données générées dans le dossier temporaire sont au format deflate et se présentent comme suit:

$ ls
000000_0.deflate  
000001_0.deflate  
000002_0.deflate  
000003_0.deflate  
000004_0.deflate  
000005_0.deflate  
000006_0.deflate  
000007_0.deflate

Voici la commande pour décompresser les fichiers déflater et tout mettre dans un seul fichier csv:

hadoop fs -text "file:///home/lvermeer/temp/*" > /home/lvermeer/result.csv
0
JohnnyHuo

Semblable à la réponse de Ray ci-dessus, Hive View 2.0 dans Hortonworks Data Platform vous permet également d'exécuter une requête Hive, puis d'enregistrer le résultat au format CSV.

0
schoon

C’est la méthode la plus conviviale pour csv que j’ai trouvée pour afficher les résultats de HiveQL.
Vous n'avez besoin d'aucune commande grep ou sed pour formater les données, mais Hive les prend en charge, il vous suffit d'ajouter une balise supplémentaire de outputformat.

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