2013-04-26 2 views
0

Я хочу передать фильтр заявление в моей свинки сценария с помощью подстановки параметровсимвол пробела в случае замены параметра

Для этого я попытался

exec -param flt='a1==1 AND a2=2' filterscript.pig 

Но, к сожалению, она бросает сообщение

на исключение
ERROR org.apache.pig.tools.grunt.Grunt - ERROR 101: Local file 'AND' does not exist. 

Pig версия - 0.9.2

Я попытался flt='\'a1==1 AND a2=2\'' и flt="a1==1 AND a2==2", предложенные пользователями свиньи на форуме apache, а также видели аналогичную запись в SO.

Любая помощь будет оценена

ответ

1

Я думаю, что вы используете параметр, передаваемый как это в качестве условия. Если это так, вы получите сообщение об ошибке. Вместо этого вы можете передать их в виде отдельных paarmeters и сформировать строку условий внутри скрипта свиньи.

exec -p p1=1 -p p2=2 filterscript.pig 

Внутри скрипта filterscript.pig вы можете использовать эти значения параметров в условных предложениях. Например

a1==$p1 AND a2=$p2 
+0

спасибо за ответ. И да, так я знаю. Видел что-то интересное http://stackoverflow.com/questions/12501537/how-can-i-pass-command-line-parameters-with-whitespace-to-an-apache-pig-script, вот почему так пытается. было много вопросов JIRA, поднятых для этой категории проблем, и все они закрыты. По их словам, они поддерживают этот способ интерпретации. – abhi

+0

Спасибо. Это интересно. Поэтому я думаю, что вы должны использовать -param "flt = 'a1 == 1 AND a2 = 2'". Это сработало для вас? – Rags

+0

yah пытался ... не работает для меня – abhi

1

Если вы запустите скрипт вне хрюкать оболочки вы можете сделать следующее:

pig -param flt="a1\=\=1 AND a2\=\=2" -f filterscript.pig 

где filterscript.pig что-то вроде этого:

A = load ... 
... 
B = filter A by $flt; 
... 

Обратите внимание, что '=' является также экранировано, в противном случае условие фильтра не будет оцениваться как boolean.

Если вы хотите использовать замену фильтра в хрюкать оболочки как вы пытались с Exec, то вы будете сталкиваться с пробельной проблемой. Поскольку побег пробелов не работает, в качестве обходного пути вы можете создать parameter file:

cat params.txt 
flt="a1\=\=1 AND a2\=\=2" 

Тогда вопрос:

exec -param_file params.txt filterscript.pig 

Примечания: Я использую Pig 0,12

+0

спасибо за ответ. Я попробовал это из-за границы оболочки, показывая «ERROR 2999: Неожиданная внутренняя ошибка. Обнаруженные неожиданные аргументы в командной строке - проверьте командную строку'. Я запустил его в режиме отладки, вывел замененный файл 'f = filter p на a1;', что означает, что он может заменить до a1 – abhi

+0

, если я просто передаю 'flt =" a1 \ = \ = 1 "', то замещенный файл выглядит как 'f = filter p by a1 == 1' – abhi

+0

Не могли бы вы отправить команду, которую вы выполнили?Я только что проверил версию 0.9.2, и она работает. –

Смежные вопросы