【问题标题】:whitespace character in case of parameter substitution参数替换时的空格字符
【发布时间】:2013-04-26 05:30:23
【问题描述】:

我想在我的猪脚本中使用参数替换传递一个过滤器语句

我已经尝试过了

    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.

猪版 - 0.9.2

我已经尝试过 apache 论坛中 pig 用户建议的 flt='\'a1==1 AND a2=2\''flt="a1==1 AND a2==2" 以及在 SO 中看到的类似帖子。

任何帮助将不胜感激

【问题讨论】:

    标签: hadoop mapreduce apache-pig


    【解决方案1】:

    我认为您正在使用传递的参数作为条件。如果是这样,您将收到这样的错误。相反,您可以将它们作为单独的参数传递,并在 pig 脚本中形成条件字符串。

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

    在您的 filterscript.pig 脚本中,您可以在条件子句中使用这些参数值。例如

    a1==$p1 AND a2=$p2
    

    【讨论】:

    • 感谢您的回复。是的,我知道。看到了一些有趣的东西stackoverflow.com/questions/12501537/…,这就是为什么要那样尝试。针对这类问题提出了许多 JIRA 问题,所有问题都已关闭。据他们说,他们支持这种解释方式。
    • 谢谢。那很有意思。所以我认为你应该使用-param“flt='a1==1 AND a2=2'”。它对你有用吗?
    【解决方案2】:

    如果您在 grunt shell 之外运行脚本,您可以执行以下操作:

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

    filterscript.pig 是这样的:

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

    注意'=' 也被转义,否则过滤条件不会被评估为布尔值。

    如果你想在 grunt shell 中使用过滤器替换,就像你尝试使用 exec 一样, 那么你会遇到空格问题。由于转义空格字符不起作用,作为一种解决方法,您可以创建一个 parameter file

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

    然后发出:

    exec -param_file params.txt filterscript.pig
    

    注意:我使用的是 Pig 0.12

    【讨论】:

    • 感谢您的回复。我已经从 grunt shell 外部尝试过它,它显示 ERROR 2999: Unexpected internal error. Encountered unexpected arguments on command line - please check the command line。我已经在调试模式下运行它,输出替换文件f = filter p by a1 ;,这意味着它可以替换到a1
    • 如果我只是通过flt="a1\=\=1" ,那么替换的文件看起来像f= filter p by a1==1
    • 能否请您发布您执行的命令?我也刚刚检查了 0.9.2 版本,它可以工作。
    • dse pig -r -p flt="a1\=\=1 AND a2\=\=2" filterscript.pig
    • 它适用于 0.9.2。我也看到了,但无法弄清楚我的问题出在哪里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 2013-05-09
    • 2019-12-09
    • 2020-12-19
    相关资源
    最近更新 更多