2012-12-04 7 views
9

J'ai beaucoup de mal à extraire des données de cochon et dans un fichier CSV que je peux utiliser en Excel ou SQL (ou R ou SPSS etc etc) sans beaucoup de manipulation ...Export de cochon vers CSV

J'ai essayé d'utiliser la fonction suivante:

STORE pig_object INTO '/Users/Name/Folder/pig_object.csv' 
    USING CSVExcelStorage(',','NO_MULTILINE','WINDOWS'); 

Il crée le dossier avec ce nom avec beaucoup de fichiers # 0000-partie-m. Je peux les rejoindre plus tard en utilisant cat part *> filename.csv mais il n'y a pas d'en-tête ce qui signifie que je dois le mettre manuellement. J'ai lu que PigStorageSchema est censé créer un autre bit avec un en-tête mais cela ne semble pas fonctionner du tout, par exemple, j'obtiens le même résultat que s'il est simplement stocké, pas de fichier d'en-tête: STORE pig_object INTO '/ Users/Name/Folder/pig_object' UTILISATION D'org.apache.pig.piggybank.storage.PigStorageSchema(); (J'ai essayé ceci en mode local et en mode mapreduce).

Existe-t-il un moyen d'extraire les données de Pig dans un simple fichier CSV sans ces étapes multiples?

Toute aide serait grandement appréciée!

Répondre

28

Je crains qu'il n'y ait pas une seule ligne qui fait le travail, mais vous pouvez venir avec les Suiveurs (Pig v0.10.0):

A = load '/user/hadoop/csvinput/somedata.txt' using PigStorage(',') 
     as (firstname:chararray, lastname:chararray, age:int, location:chararray); 
store A into '/user/hadoop/csvoutput' using PigStorage('\t','-schema'); 

Quand PigStorage prend « -schema » il crée un '.pig_schema' et un '.pig_header' dans le répertoire de sortie. Ensuite, vous devez fusionner « .pig_header » avec « part-x-xxxxx »:

1. Si le résultat besoin par copiés sur le disque local:

hadoop fs -rm /user/hadoop/csvoutput/.pig_schema 
hadoop fs -getmerge /user/hadoop/csvoutput ./output.csv 

(Depuis -getmerge prend un répertoire d'entrée dont vous avez besoin pour obtenir débarrasser de .pig_schema premier)

2. Stockage du résultat sur HDFS:

hadoop fs -cat /user/hadoop/csvoutput/.pig_header 
    /user/hadoop/csvoutput/part-x-xxxxx | 
    hadoop fs -put - /user/hadoop/csvoutput/result/output.csv 

Pour plus de référence, vous pouvez aussi jeter un oeil à ces postes:
STORE output to a single CSV?
How can I concatenate two files in hadoop into one using Hadoop FS shell?

+0

Merci beaucoup pour votre aide, Lorand. Appeler les commandes du shell nettoie un peu les choses. Toutefois, l'argument -schema ne crée pas les fichiers .pig_header ou .pig_schema lorsque je l'exécute. J'ai essayé d'utiliser PigStorage et PigStorageSchema. Je cours le cochon 0.10.0. – Saxivore

+0

Salut mate, à côté de ça ... le fichier .pig_header _is_ a été créé mais il était caché et je ne pouvais pas le voir (je m'habitue toujours à travailler avec des trucs shell). Donc, j'ai une solution de contournement qui peut être faite dans un script qui est génial. Merci! – Saxivore

+0

@Saxivore Vérifiez le schéma de 'pig_object.' S'il n'y en a pas, aucun fichier d'en-tête et de schéma ne sera créé. Avez-vous besoin d'aide supplémentaire pour cette question? –

1

si vous stockerez vos données PigStorage sur HDFS puis fusionner en utilisant -getmerge -nl:

STORE pig_object INTO '/user/hadoop/csvoutput/pig_object' 
    using PigStorage('\t','-schema'); 
fs -getmerge -nl /user/hadoop/csvoutput/pig_object /Users/Name/Folder/pig_object.csv; 

Docs:

En option -nl peut être défini pour activer l'ajout d'un caractère de nouvelle ligne (LF) à à la fin de chaque fichier.

vous aurez un seul fichier TSV/CSV avec la structure suivante:

1 - header 
2 - empty line 
3 - pig schema 
4 - empty line 
5 - 1st line of DATA 
6 - 2nd line of DATA 
... 

afin que nous puissions simplement supprimer les lignes [2,3,4] utilisant AWK:

awk 'NR==1 || NR>4 {print}' /Users/Name/Folder/pig_object.csv > /Users/Name/Folder/pig_object_clean.csv