2013-01-07 2 views
6

Sto scrivendo un alfabeto latino maiale simile al seguente:Come posso aggiungere una riga di intestazione ai file creati da Pig (Hadoop)?

A = load 'data' using PigStorage('\t'); 
store A into my_data using PigStorage(); 

Emette

(Bob, 10, 4.0) 
(Jim, 11, 3.25) 
(Paul, 9, 2.75) 

vorrei aggiungere una prima riga di intestazione di ogni file memorizzato nella HDFS

(Name, Age, GPA) 
(Bob, 10, 4.0) 
(Jim, 11, 3.25) 
(Paul, 9, 2.75) 

Qualche idea?

risposta

11

Questo non ha molto senso per Pig. Ogni riga è un record separato di dati, quindi, a meno che non ci sia realmente una persona con il nome Name, con un'età di Age e un GPA di GPA, avere una tale linea è sbagliata. Inoltre, Pig non fornisce garanzie sull'ordine in cui i campi verranno emessi (a meno che non si usi ORDER BY), quindi la riga di intestazione potrebbe apparire ovunque.

Quello che stai chiedendo è un modo per mantenere il tuo schema dopo che Pig ha finito con il suo lavoro, in modo da non dover ricordare quello che è o cercare da qualche parte. A partire da Pig 0.10, questo è stato possibile con PigStorage memorizzando lo schema della relazione come un file JSON .pig_schema, nella stessa directory dell'output. Vedere this page per informazioni più dettagliate su cosa sia e come usarlo.

+6

Si giustifica solo la mancanza di una funzionalità, spiegando perché gli sviluppatori non l'hanno aggiunta. Se il consumatore finale lo desidera davvero, vorrebbe discutere perché non ha senso? –

+1

È possibile utilizzare una diversa funzione di memorizzazione. Vedere la mia risposta per un collegamento: http://stackoverflow.com/questions/14204275/how-can-i-add-a-header-row-to-files-created-from-pig-hadoop/31155621#31155621 –

1

La risposta è no, non puoi fare quello che vuoi veramente fare.

Come suggerito da @Winni, ci sono soluzioni alternative mantenendo un file di schema in giro, ma questo è un sacco di hack.

Indossare il cappello del consumatore (sono anche uno sviluppatore), devo dire che Pig non ha questa caratteristica. Non ci interessa quanto senso abbia per maiale quando sta trasmettendo qualcosa in PigStorage come essenzialmente un file CSV, per fornire la possibilità di avere anche la riga di intestazione, per quegli utenti smemorati e meschini di dare un senso ai dati.

Quando, ho una riga, con circa dieci diversi datetimes, e mi rende quasi impossibile comprendere i dati, finché non aggiungo manualmente la riga di intestazione.

0

Penso che la cosa migliore da fare sia DESCRIVERE la relazione che trasmetterete su un set di test nella shell Grunt, quindi copiare & incollandola in un e.g. comando bash che aggiunge il record alla parte superiore del file dopo averlo scaricato da HDFS e incollarlo in un file flat. Quindi, qualcosa di simile a:

sed -i '1s/^/(Name, Age, GPA) /' filename.tsv 

(. Si noti che, come scritto questo scriverà-in-place, uscita in modo forse diretto a un nuovo file, se sei un n00b comando di shell)

+1

I speriamo sia ovvio che questa soluzione agisca su una concatenazione di file * part emessi da HDFS, non i file memorizzati in HDFS. Come hanno notato i precedenti poster, ha più senso fare ciò che si vuole fare con un output di HDFS. –

10

È possibile utilizzare CSVExcelStorage come la funzione di memorizzazione, che ti permette di fare esattamente ciò che si vuole:

uscita STORE iN '/ outputfolder /' UTILIZZO org.apache.pig.piggybank.storage.CSVExcelStorage ('\ t', 'NO_MULTILINE' , 'UNIX', 'WRITE_OUTPUT_HEADER');

L'opzione "WRITE_OUTPUT_HEADER" consente di scrivere l'intestazione in ogni file che soddisfi il proprio caso d'uso.