Подтвердить что ты не робот

Как заставить STORE (перезаписать) HDFS в Pig?

При разработке сценариев Pig, использующих команду STORE, я должен удалить выходной каталог для каждого запуска или script и предлагает:

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

Итак, я ищет решение in-Pig для автоматического удаления каталога, а также тот, который не задыхается, если каталог не существует во время вызова.

В латинском справочнике Pig я обнаружил команду shell shell invoker fs. К сожалению, Pig script ломается всякий раз, когда что-либо вызывает ошибку. Поэтому я не могу использовать

fs -rmr foo/bar

(то есть удаляем рекурсивно), так как он ломается, если каталог не существует. На мгновение я подумал, что могу использовать

fs -test -e foo/bar

который является тестом и не должен ломаться или так я думал. Однако Pig снова интерпретирует test код возврата в несуществующей директории как код отказа и разрывается.

Существует JIRA ticket для проекта Pig, который решает мою проблему и предлагает дополнительный параметр OVERWRITE или FORCE_WRITE для команды STORE. Во всяком случае, я использую Pig 0.8.1 по необходимости и нет такого параметра.

4b9b3361

Ответ 1

Наконец, я нашел решение на grokbase. Поскольку поиск решения занимает слишком много времени, я воспроизведу его здесь и добавлю к нему.

Предположим, что вы хотите сохранить свой вывод, используя оператор

STORE Relation INTO 'foo/bar';

Затем, чтобы удалить каталог, вы можете позвонить в начале script

rmf foo/bar

Нет ";" или цитаты, требуемые, поскольку это команда оболочки.

Я не могу воспроизвести его сейчас, но в какой-то момент времени я получил сообщение об ошибке (что-то о отсутствующих файлах), где я могу только предположить, что rmf вмешивается в map/reduce. Поэтому я рекомендую поставить вызов перед объявлением любого отношения. После SET, REGISTER и значения по умолчанию должны быть точными.

Пример:

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';

Ответ 2

Как только вы используете команду fs, есть много способов сделать это. Для отдельного файла я закончил добавление этого в начало моих скриптов:

-- 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

Для каталога

-- Delete dir
fs -rm -r out