【问题标题】:Filtering based on condition in apache pig在 apache pig 中根据条件进行过滤
【发布时间】:2016-06-24 11:45:47
【问题描述】:

我正在尝试根据某些条件过滤表格, 我想做以下事情: 如果 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

【问题讨论】:

  • 完整的堆栈跟踪很有帮助。也许看看例如Pig - use ternary condition to filter based on different condition,或Using Pig conditional operator to implement or? ...谢谢。 PS:由于 0.12.0 Pig 有一个 IN 运算符 ;-) 这可能很酷,可以替换 OR 链......并帮助清除字段以发现错误......
  • 我已按要求添加了完整的堆栈跟踪
  • 造成的部分被削减了......但下面看起来并没有更清晰,做同样的事情(未经测试,因为我现在没有 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 验证器的语句点的语法错误。

标签: apache-pig


【解决方案1】:

这是调试情况的方法,我希望这可以回答您的问题,让您自己找到问题,否则我可以根据您的额外输入进行更新:

  1. 如果您注释掉过滤行,请确保代码不会出错
  2. 制作最简单的过滤器并尝试运行它

如果简单的运行成功

如果您找到添加复杂性使其失败的确切位置,请逐渐使其变得更加复杂,(可能在这个问题中)

如果简单的运行不成功

如果即使是最微不足道的案例也失败了,请确保创建一个可重现的示例并对其进行检查(可能在这个问题中)

【讨论】:

  • 除此之外,您还可以尝试以不需要 if-then-else 语句的方式重写逻辑条件是否有帮助。像 DTcond AND ((wirecond AND NOT countrycond) OR (NOT wirecond)) 之类的东西,甚至使用两个连续的过滤语句(或 3 和一个联合)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 2022-08-08
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
相关资源
最近更新 更多