2012-12-04 24 views
9

Sto avendo un sacco di problemi nel trasferire i dati dal maiale e in un CSV che posso usare in Excel o SQL (o R o SPSS ecc. Ecc.) Senza molta manipolazione ...Esportazione da maiale a CSV

ho provato con la seguente funzione:

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

crea la cartella con lo stesso nome con un sacco di # file part-m-0000. Posso in seguito unirmi a tutti usando cat part *> nomefile.csv ma ​​non c'è intestazione che significa che devo inserirla manualmente.

Ho letto che PigStorageSchema dovrebbe creare un altro bit con un'intestazione ma non sembra funzionare affatto, ad esempio, ottengo lo stesso risultato come se fosse appena memorizzato, nessun file di intestazione: STORE pig_object INTO '/ Users/Name/Folder/pig_object' UTILIZZO org.apache.pig.piggybank.storage.PigStorageSchema();

(l'ho provato sia in modalità locale che in versione mappa).

Esiste un modo per estrarre i dati da Pig in un semplice file CSV senza questi passaggi multipli?

Qualsiasi aiuto sarebbe molto apprezzato!

risposta

28

ho paura non è una battuta che fa il lavoro, ma si può venire con i seguenti (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'); 

Quando PigStorage prende '-schema' it creerà un '.pig_schema' e un '.pig_header' nella directory di output. Poi si deve unire i '.pig_header' con 'part-x-xxxxx':

1. Se il risultato ha bisogno di venire copiati sul disco locale:

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

(Dal -getmerge prende una directory di input è necessario per ottenere liberarsi di .pig_schema prima)

2. Memorizzazione il risultato sul HDFS:

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

Per ulteriori riferimenti si potrebbe anche dare un'occhiata a questi posti:
STORE output to a single CSV?
How can I concatenate two files in hadoop into one using Hadoop FS shell?

+0

Grazie molto per la vostra assistenza, Lorand. Chiamare i comandi della shell pulisce un po 'le cose. Tuttavia, l'argomento -schema non crea i file .pig_header o .pig_schema durante l'esecuzione. Ho provato a utilizzare PigStorage e PigStorageSchema. Sto eseguendo Pig 0.10.0. – Saxivore

+0

Ciao amico, oltre a questo ... il file .pig_header _è stato creato ma era nascosto e non riuscivo a vederlo (mi sto ancora abituando a lavorare con le shell). Quindi, ho una soluzione che può essere fatta all'interno di uno script che è fantastico. Grazie! – Saxivore

+0

@Saxivore Controlla lo schema di 'pig_object'. Se non ce n'è uno non verrà creato alcun file di intestazione e schema. Hai bisogno di ulteriore aiuto con questa domanda? –

1

se si vuole memorizzare i dati come PigStorage su HDFS e quindi unire utilizzando -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:

Opzionalmente -nl può essere impostato per abilitare l'aggiunta di un carattere di nuova riga (LF) a alla fine di ogni file.

si avrà un unico TSV/il file CSV con la seguente struttura:

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

così possiamo semplicemente rimuovere le linee [2,3,4] con AWK:

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