Apache pig apachepig中基于条件的过滤

Apache pig apachepig中基于条件的过滤,apache-pig,Apache Pig,我试图根据某些条件筛选表, 我想做以下工作: 如果wire_on='true',我想根据客户分区和国家/地区条件进行过滤,否则只需客户分区。 以下是我在pig脚本中使用的语句: 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== '

我试图根据某些条件筛选表, 我想做以下工作: 如果wire_on='true',我想根据客户分区和国家/地区条件进行过滤,否则只需客户分区。 以下是我在pig脚本中使用的语句:

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'));
我有一个新奇的例外

有人能帮我吗

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

以下是您如何调试该情况的方法,我希望通过让您自己找到问题来回答您的问题,否则我可以根据您的其他输入进行更新:

  • 如果注释掉筛选行,请确保代码不会给出错误
  • 制作最简单的过滤器并尝试运行它
  • 如果一次小的运行成功 如果你发现了增加复杂性使其失败的确切位置,则逐渐使其变得更复杂(可能在这个问题中)

    如果一个小的运行不成功
    如果哪怕是最简单的案例都失败了,请确保创建一个可复制的示例,并检查(可能在本问题中)

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

  • 如果注释掉筛选行,请确保代码不会给出错误
  • 制作最简单的过滤器并尝试运行它
  • 如果一次小的运行成功 如果你发现了增加复杂性使其失败的确切位置,则逐渐使其变得更复杂(可能在这个问题中)

    如果一个小的运行不成功
    如果哪怕是最简单的案例都失败了,请确保创建一个可复制的示例并检查(可能在本问题中)

    完整的stacktrace是有用的。也许看看例如,或者。。。谢谢PS:因为0.12.0清管器有一个IN操作符;-)这可能是很酷的,以取代或链…并帮助清除字段,以发现错误…我已经添加了完整的堆栈跟踪请求造成的部分被切断。。。但下面的内容看起来是否更清晰,是否相同(未经测试,因为我现在没有PIG访问权限)
    B=FILTER A by dt='$CUSTOMER\u PARTITION\u dt',而不是(wire\u on='true'?国家/地区('AM','AZ','BG','by','EE','GE','KG','KZ','LT',LV MD RU TJ','TM','UA UZ'):false)
    可能有助于知识渊博的人员发现语法/解析器错误(这似乎是),因为没有任何可行的替代方法会像AST验证器读取语句点的语法错误一样。完整的stacktrace很有帮助。也许看看例如,或者。。。谢谢PS:因为0.12.0清管器有一个IN操作符;-)这可能是很酷的,以取代或链…并帮助清除字段,以发现错误…我已经添加了完整的堆栈跟踪请求造成的部分被切断。。。但下面的内容看起来是否更清晰,是否相同(未经测试,因为我现在没有PIG访问权限)
    B=FILTER A by dt='$CUSTOMER\u PARTITION\u dt',而不是(wire\u on='true'?国家/地区('AM','AZ','BG','by','EE','GE','KG','KZ','LT',LV MD RU TJ','TM','UA UZ'):false)
    可能有助于知识渊博的人员发现语法/解析器错误(这似乎是),因为没有任何可行的替代方法会像AST验证器读取语句点的语法错误一样。除此之外,您还可以尝试是否有助于以不需要if-then-else语句的方式重写逻辑条件。类似于DTcond和((wirecond而非countrycond)或(非wirecond)),甚至使用两个连续的filter语句(或3和一个union)除此之外,您还可以尝试是否有助于以不需要if-then-else语句的方式重写逻辑条件。类似于DTcond和((wirecond而非countrycond)或(非wirecond)),甚至使用两个连续的筛选语句(或3和一个union)