tutorial pig apache-pig hdfs

apache pig - tutorial - ¿Cómo forzar la TIENDA(sobrescribir) para HDFS en Pig?



apache pig tutorial (2)

Al desarrollar scripts de Pig que utilizan el comando STORE , tengo que eliminar el directorio de salida para cada ejecución o el script se detiene y ofrece:

2012-06-19 19:22:49,680 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 6000: Output Location Validation Failed for: ''hdfs://[server]/user/[user]/foo/bar More info to follow: Output directory hdfs://[server]/user/[user]/foo/bar already exists

Así que estoy buscando una solución in-Pig para eliminar automáticamente el directorio , también una que no se ahogue si el directorio no existe en el momento de la llamada.

En la referencia latina de Pig encontré el comando shell invocador fs . Desafortunadamente, el script de Pig se rompe cuando algo produce un error. Así que no puedo usar

fs -rmr foo/bar

(es decir, eliminar de forma recursiva) ya que se rompe si el directorio no existe. Por un momento pensé que podría usar

fs -test -e foo/bar

Lo cual es una prueba y no debería romperse o eso pensé. Sin embargo, Pig nuevamente interpreta el código de retorno de la test en un directorio no existente como un código de falla y se rompe.

Hay un ticket JIRA para el proyecto Pig que aborda mi problema y sugiere un parámetro opcional OVERWRITE o FORCE_WRITE para el comando STORE . De todos modos, estoy usando Pig 0.8.1 por necesidad y no hay tal parámetro.


Por fin encontré una solución en la grokbase de grokbase . Ya que encontrar la solución tomó demasiado tiempo, la reproduciré aquí y la añadiré.

Supongamos que desea almacenar su salida utilizando la declaración

STORE Relation INTO ''foo/bar'';

Luego, para eliminar el directorio, puede llamar al inicio del script

rmf foo/bar

No ";" o cotizaciones requeridas ya que es un comando de shell.

No puedo reproducirlo ahora, pero en algún momento recibí un mensaje de error (algo relacionado con archivos faltantes) en el que solo puedo asumir que rmf interfirió con el mapa / reducir. Así que recomiendo poner la llamada antes de cualquier declaración de relación. Después de los SET, los REGISTROS y los valores predeterminados deben estar bien.

Ejemplo:

SET mapred.fairscheduler.pool ''inhouse''; REGISTER /usr/lib/pig/contrib/piggybank/java/piggybank.jar; %default name ''foobar'' rmf foo/bar Rel = LOAD ''something.tsv''; STORE Rel INTO ''foo/bar'';


Una vez que use el comando fs, hay muchas formas de hacerlo. Para un archivo individual, terminé agregando esto al comienzo de mis scripts:

-- Delete file (won''t work for output, which will be a directory -- but will work for a file that gets copied or moved during the -- the script.) fs -touchz top_100 rm top_100

Para un directorio

-- Delete dir fs -rm -r out