2011-04-21 7 views
8

Como tengo noted previously, Pig no soporta bien los archivos vacíos (0 bytes). Desafortunadamente, hay muchas maneras de crear estos archivos (incluso within Hadoop utilitities).¿Cómo utiliza Pig Hadoop Globs en una declaración de 'carga'?

Pensé que podría solucionar este problema cargando explícitamente solo los archivos que coinciden con una convención de nomenclatura dada en el LOAD statement usando Hadoop's glob syntax. Desafortunadamente, esto no parece funcionar, ya que incluso cuando uso un glob para filtrar a archivos de entrada conocidos, todavía me encuentro con la falla de 0 bytes mentioned earlier.

He aquí un ejemplo: Supongamos que tengo los siguientes archivos en S3:

  • MyBucket/a/b/(0 bytes)
  • MyBucket/a/b/myfile.log (> 0 bytes)
  • MyBucket/a/b/yourfile.log (> 0 bytes)

Si utilizo una declaración de carga como esto en mi guión de cerdo:

myData = load 's3://mybucket/a/b/*.log as (...) 

Supongo que Pig no se ahogaría en el archivo de 0 bytes, pero aún lo hace. ¿Hay algún truco para que Pig solo observe los archivos que coinciden con el patrón glob esperado?

Respuesta

3

Esta es una solución bastante fea, pero los globs que no se basan en la sintaxis comodín * parecen funcionar. Por lo tanto, en nuestro flujo de trabajo (antes de llamar a nuestro script de cerdo), enumeramos todos los archivos debajo del prefijo que nos interesa y luego creamos un globo específico que consta de solo las rutas que nos interesan.

For ejemplo, en el ejemplo anterior, enumeramos "MyBucket/a":

hadoop fs -lsr s3://mybucket/a 

que devuelve una lista de archivos, además de otros metadatos. Podemos entonces crear el pegote partir de esos datos:

myData = load 's3://mybucket/a/b{/myfile.log,/yourfile.log}' as (...) 

Esto requiere un trabajo de poco más de front-end, pero nos permite dirigirse específicamente a los archivos que nos interesan y evitar los archivos de 0 bytes.

Actualización: Desafortunadamente, he encontrado que esta solución falla cuando el patrón de glob se hace largo; Pig termina lanzando una excepción "No se puede crear un segmento de entrada".

Cuestiones relacionadas