2012-09-05 7 views
7

I file sono denominati part-r-000 [0-9] [0-9] e contengono campi separati da tabulazioni. Posso visualizzarli usando hadoop fs -text part-r-00000 ma non riesco a farli caricare usando maiale.Apache Pig: carica un file che mostra bene usando hadoop fs-text

Quello che ho provato:

x = load 'part-r-00000'; 
dump x; 
x = load 'part-r-00000' using TextLoader(); 
dump x; 

ma che mi dà solo spazzatura. Come posso visualizzare il file usando maiale?

Ciò che potrebbe essere rilevante è che il mio hdf sta ancora utilizzando il CDH-2 al momento. Inoltre, se scarico il file in locale ed eseguo file part-r-00000, si dice part-r-00000: data, non so come decomprimerlo localmente.

+0

Credo che il vostro primo 'load' utilizza PigStorage, ma forse si puoi ricontrollare esplicitamente, 'x = LOAD 'part-r-00000' USING USANDO PigStorage ('\ t')'. Quando si scarica il file localmente, se lo si visualizza (ad esempio 'tail'), è garbage/binary? Puoi dare un esempio di codice che ha generato questi dati? –

+0

Utilizzo di PigStorage fornisce esplicitamente lo stesso risultato. Scaricando in locale (usando -get o -copyToLocal) il file non è leggibile, i. e. binario/spazzatura (meno o coda). Cercherò di trovare il codice che ha creato questi file e di riferire. – exic

+0

Sembra che il file sia stato memorizzato come un file di sequenza. Sono stato in grado di estrarre le righe da esso utilizzando una funzione di caricamento definita dall'utente. C'è un modo più semplice rispetto all'utilizzo di udf? – exic

risposta

4

Secondo HDFS Documentation, hadoop fs -text <file> può essere utilizzato su dati "zip e TextRecordInputStream", quindi i dati potrebbero trovarsi in uno di questi formati.

Se il file è stato compresso, normalmente Hadoop aggiungerebbe l'estensione quando si esegue l'output su HDFS, ma se questo fosse mancante, si potrebbe provare il test decomprimendo/decomprimendo/unbzip2ing/etc localmente. Sembra che Pig dovrebbe eseguire questa decompressione automaticamente, ma potrebbe richiedere la presenza dell'estensione del file (ad esempio part-r-00000.zip) - more info.

Non sono troppo sicuro su TextRecordInputStream .. sembra che sarebbe solo il metodo predefinito di Pig, ma potrei sbagliarmi. Non ho visto alcuna menzione del caricamento di questi dati via Pig quando ho fatto un rapido Google.

Aggiornamento: Dal momento che hai scoperto che è un file di sequenza, ecco come si può caricare con PiggyBank:

-- using Cloudera directory structure: 
REGISTER /usr/lib/pig/contrib/piggybank/java/piggybank.jar 
--REGISTER /home/hadoop/lib/pig/piggybank.jar 
DEFINE SequenceFileLoader org.apache.pig.piggybank.storage.SequenceFileLoader(); 


-- Sample job: grab counts of tweets by day 
A = LOAD 'mydir/part-r-000{00..99}' # not sure if pig likes the {00..99} syntax, but worth a shot 
    USING SequenceFileLoader AS (key:long, val:long, etc.); 
+1

'{00..99}' non ha funzionato, quindi sto semplicemente usando '*' invece.Successivamente la riga può essere letta usando 'B = FOREACH A GENERATE flatten (STRSPLIT (val, '\ t')) AS (ecc.)', Poiché SequenceFileLoader restituisce solo due colonne. – exic

3

Se si desidera modificare (lettura/scrittura) file di sequenza con Pig quindi puoi provare anche su Twitter Elephant-Bird.

È possibile trovare gli esempi here come leggerli/scriverli.

Se si utilizzano i Writable personalizzati nel file di sequenza, è possibile implementare un convertitore personalizzato estendendo AbstractWritableConverter.

Nota: che Elephant-Bird deve avere installato Thrift nella macchina. Prima di costruire, assicurarsi che sta usando la versione corretta Thrift che hai e anche fornire il percorso corretto dell'eseguibile Thrift nella sua pom.xml:

<plugin> 
    <groupId>org.apache.thrift.tools</groupId> 
    <artifactId>maven-thrift-plugin</artifactId> 
    <version>0.1.10</version> 
    <configuration> 
    <thriftExecutable>/path_to_thrift/thrift</thriftExecutable> 
    </configuration> 
</plugin>