Comment puis-je afficher les résultats d’une requête HiveQL sur 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; 

Quand je l’exécute, il dit qu’il s’est terminé avec succès mais je ne peux jamais trouver le fichier. Comment trouver ce fichier ou dois-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, cela peut ne pas être la meilleure méthode pour votre cas particulier. Tout d’abord, laissez-moi vous expliquer ce que fait INSERT OVERWRITE , puis je décrirai la méthode que j’utilise pour obtenir les fichiers tsv à partir des tables Hive.

Selon le manuel , votre requête stockera les données dans un répertoire dans HDFS. Le format ne sera pas 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 nouvelles 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 (en ajoutant le mot-clé LOCAL ) stockera les données dans un répertoire local.

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

Lorsque je lance une requête similaire, voici à quoi ressemble la sortie.

 [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 généralement ma requête directement via Hive sur la ligne de commande pour ce genre de chose, et la dirige dans le fichier local comme suit:

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

Cela me donne un fichier séparé par tabulation que je peux utiliser. J’espère que c’est utile pour vous aussi.

Basé sur ce patch-3682 , je pense qu’une meilleure solution est disponible avec Hive 0.11, mais je ne suis pas en mesure de le tester moi-même. La nouvelle syntaxe devrait autoriser les éléments suivants.

 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 un box 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 sur votre disque ordinaire et les fusionner en un seul fichier.

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

Si vous utilisez HUE, c’est assez simple. Accédez simplement à l’éditeur Hive dans HUE, exécutez votre requête Hive, puis enregistrez le fichier de résultats localement sous XLS ou CSV ou vous pouvez enregistrer le fichier de résultats dans HDFS.

Je cherchais une solution similaire, mais celles mentionnées ici ne fonctionneraient pas. Mes données contenaient toutes les variantes d’espaces (espace, nouvelle ligne, tabulation) et de virgules.

Pour rendre la colonne data tsv sûre, j’ai remplacé tous les caractères \ t dans les données de la 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 aidera ceux qui recherchent cette solution.

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

pour ex:

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

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

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

Étape 1 – Chargement des 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 – Copie du blob de l’entrepôt Hive au 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" 

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 

Alors, considérez le délimiteur + ” ^A ” comme un nouveau délimiteur.

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 la sortie en tant que csv.