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!
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.
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
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.
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.
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
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.
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"
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
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.
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.
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
J'ai essayé diverses options, mais ce serait l'une des solutions les plus simples pour Python
Pandas
:
Hive -e 'select books from table' | grep "|" ' > temp.csv
df=pd.read_csv("temp.csv",sep='|')
Vous pouvez également utiliser tr "|" ","
pour convertir "|" à ","
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
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.
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:
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
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
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.
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