2012-09-05 10 views
7

Tengo archivos que se llaman part-r-000 [0-9] [0-9] y que contienen campos separados por tabulaciones. Puedo verlos usando hadoop fs -text part-r-00000 pero no puedo cargarlos usando pig.Apache Pig: carga un archivo que muestra bien usando hadoop fs -text

Lo que he intentado:

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

pero que sólo me da la basura. ¿Cómo puedo ver el archivo usando pig?

Lo que podría ser relevante es que mi HDF todavía está utilizando CDH-2 en este momento. Además, si descargo el archivo a local y ejecuto file part-r-00000 dice part-r-00000: data, no sé cómo descomprimirlo localmente.

+0

Creo que su primera 'load' utiliza PigStorage, pero tal vez puede verificar dos veces al ser explícito, 'x = LOAD 'part-r-00000' UTILIZANDO USANDO PigStorage ('\ t')'. Cuando descarga el archivo localmente, si lo ve (es decir, 'tail'), ¿es basura/binario? ¿Puedes dar un ejemplo del código que generó estos datos? –

+0

El uso de PigStorage explícitamente da el mismo resultado. Descargando a local (usando -get o -copyToLocal) el archivo no es legible, i. mi. binario/basura (menos o cola). Trataré de encontrar el código que creó estos archivos e informaré. – exic

+0

Parece que el archivo se ha almacenado como un archivo de secuencia. Pude extraer líneas de él utilizando una función de carga definida por el usuario. ¿Hay una manera más simple que usar el udf? – exic

Respuesta

4

Según HDFS Documentation, hadoop fs -text <file> se puede utilizar en datos "zip y TextRecordInputStream", por lo que sus datos pueden estar en uno de estos formatos.

Si el archivo se comprimió, normalmente Hadoop agregaría la extensión al enviar a HDFS, pero si esto faltara, podría probar las pruebas descomprimiendo/descomprimiendo/unbzip2ing/etc localmente. Parece que Pig debería hacer esta descompresión automáticamente, pero puede requerir que la extensión de archivo esté presente (por ejemplo, part-r-00000.zip) - more info.

No estoy muy seguro en el TextRecordInputStream ... parece que sería el método predeterminado de Pig, pero podría estar equivocado. No vi ninguna mención de CARGAR esta información a través de Pig cuando hice un rápido Google.

Actualización: Dado que usted ha descubierto que es un archivo de secuencia, aquí es cómo se puede cargarlo utilizando 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}' no funcionó, así que simplemente estoy usando '*' en su lugar.Después, la línea se puede leer usando 'B = FOREACH A GENERATE flatten (STRSPLIT (val, '\ t')) AS (etc.)', ya que SequenceFileLoader devuelve solo dos columnas. – exic

3

Si se quiere manipular (lectura/escritura) archivos de secuencia con Pig entonces puedes probar el Twitter Elephant-Bird también.

Puede encontrar here ejemplos de cómo leerlos/escribirlos.

Si utiliza Writables personalizados en el archivo de secuencia, puede implementar un convertidor personalizado ampliando AbstractWritableConverter.

Tenga en cuenta que Elephant-Bird necesita tener instalado Thrift en su máquina. Antes de su construcción, asegúrese de que está utilizando la versión correcta de Ahorro que tiene y también proporcionar la ruta correcta del ejecutable de Ahorro en su 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> 
Cuestiones relacionadas