Фильтрация по условию в apache pig

Я пытаюсь отфильтровать таблицу на основе некоторого условия, я хочу сделать следующее: если wire_on = 'true', я хочу фильтровать как по CUSTOMER_PARTITION_DT, так и по условию страны, иначе просто CUSTOMER_PARTITION_DT. Ниже приведено утверждение, которое я использую в своем сценарии свиньи:

B = FILTER A by ((wire_on=='true')?(dt=='$CUSTOMER_PARTITION_DT' AND NOT( country == 'RU' OR country == 'BG' OR country == 'LV' OR country == 'LT' OR country== 'EE' OR country=='KG' OR country=='KZ' OR country == 'MD' OR country == 'TJ' OR country =='TM' OR country == 'UA' OR country == 'GE' OR country == 'BY' OR country == 'UZ' OR country =='AM' OR country == 'AZ')):(dt=='$CUSTOMER_PARTITION_DT'));

Я получаю NoViableAltException

Может кто-то помочь мне с этим

EDIT :

Failed to parse: Pig script failed to parse: NoViableAltException(6@[])
        at org.apache.pig.parser.QueryParserDriver.parse(QueryParserDriver.java:199)
        at org.apache.pig.PigServer$Graph.parseQuery(PigServer.java:1735)
        at org.apache.pig.PigServer$Graph.access$000(PigServer.java:1443)
        at org.apache.pig.PigServer.parseAndBuild(PigServer.java:387)
        at org.apache.pig.PigServer.executeBatch(PigServer.java:412)
        at org.apache.pig.PigServer.executeBatch(PigServer.java:398)
        at org.apache.pig.tools.grunt.GruntParser.executeBatch(GruntParser.java:171)
        at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:234)
        at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:205)
        at org.apache.pig.tools.grunt.Grunt.exec(Grunt.java:81)
        at org.apache.pig.Main.run(Main.java:624)
        at org.apache.pig.Main.main(Main.java:170)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: NoViableAltException(6@[])
        at org.apache.pig.parser.AstValidator.expr(AstValidator.java:8637)
        at org.apache.pig.parser.AstValidator.expr(AstValidator.java:9115)
        at org.apache.pig.parser.AstValidator.bin_expr(AstValidator.java:10531)
        at org.apache.pig.parser.AstValidator.projectable_expr(AstValidator.java:9790)
        at org.apache.pig.parser.AstValidator.var_expr(AstValidator.java:9582)
        at org.apache.pig.parser.AstValidator.expr(AstValidator.java:8985)
        at org.apache.pig.parser.AstValidator.cond(AstValidator.java:7820)
        at org.apache.pig.parser.AstValidator.filter_clause(AstValidator.java:7328)
        at org.apache.pig.parser.AstValidator.op_clause(AstValidator.java:1683)
        at org.apache.pig.parser.AstValidator.general_statement(AstValidator.java:1035)
        at org.apache.pig.parser.AstValidator.statement(AstValidator.java:499)
        at org.apache.pig.parser.AstValidator.query(AstValidator.java:373)
        at org.apache.pig.parser.QueryParserDriver.validateAst(QueryParserDriver.java:258)
        at org.apache.pig.parser.QueryParserDriver.parse(QueryParserDriver.java:186)
        ... 17 more

person medha    schedule 24.06.2016    source источник
comment
Полная трассировка стека полезна. Может быть, посмотрите, например. Pig - использовать троичное условие для фильтрации на основе другого условия или Использование условного оператора Pig для реализации or? . .. Спасибо. PS: Начиная с 0.12.0 Pig имеет оператор IN ;-) может быть здорово заменить цепочку OR ... и помочь очистить поле, чтобы обнаружить ошибку ...   -  person Dilettant    schedule 24.06.2016
comment
я добавил полную трассировку стека по запросу   -  person medha    schedule 24.06.2016
comment
Вызванная часть вырезана ... но следующее не выглядит яснее, делает то же самое (не проверено, поскольку сейчас у меня нет доступа к PIG) B = FILTER A by dt=='$CUSTOMER_PARTITION_DT' AND NOT ( wire_on=='true' ? country IN('AM', 'AZ', 'BG', 'BY', 'EE', 'GE', 'KG', 'KZ', 'LT', 'LV', 'MD', 'RU', 'TJ', 'TM', 'UA', 'UZ'): false ); и, возможно, помогает знающим людям PIG обнаружить эту ошибку синтаксиса / парсера (это кажется) , так как ни одна жизнеспособная альтернатива не читается как синтаксическая ошибка в утверждении валидатором AST.   -  person Dilettant    schedule 24.06.2016


Ответы (1)


Вот как вы можете отладить ситуацию, я надеюсь, что это ответит на ваш вопрос, позволив вам найти проблему самостоятельно, в противном случае я могу обновить ее на основе вашего дополнительного ввода:

  1. Убедитесь, что код не выдает ошибку, если вы закомментируете строку фильтра
  2. Сделайте самый банальный фильтр и попробуйте его запустить

Если тривиальный запуск удался

Постепенно усложняйте, если вы нашли точное место, где добавление усложнения приводит к сбою (возможно, в этом вопросе)

Если тривиальный запуск не удался

Если даже самый тривиальный случай терпит неудачу, обязательно создайте воспроизводимый пример и изучите его (возможно, в этом вопросе)

person Dennis Jaheruddin    schedule 24.06.2016
comment
В дополнение к этому вы также можете попробовать переписать логическое условие таким образом, чтобы не требовался оператор if-then-else. Что-то вроде DTcond AND ((wirecond AND NOT countrycond) ИЛИ (NOT wirecond)), или даже использовать два последовательных оператора фильтра (или 3 и объединение) - person Dennis Jaheruddin; 24.06.2016