在 Pig 声明语句中转义括号
Posted
技术标签:
【中文标题】在 Pig 声明语句中转义括号【英文标题】:Escaping parenthesis in Pig declare statement 【发布时间】:2018-02-25 15:25:37 【问题描述】:猪版:0.12.0-cdh5.10.1
我在使用 pig 方面相当陌生。我了解到有几种方法可以在 pig 中定义参数。其中之一是“声明”声明。只是想知道,我们是否可以在参数值中使用像“(”和“)”(括号)这样的字符。我试图在声明语句中保存一些(不同提要的变量)查找值,这些查找值可能包含“(”和“)”字符,因此会引发错误。我还尝试使用 "\" 和 "\\" 转义这些字符,但它似乎不起作用 例如, 在猪中运行以下语句:
%declare DESC 'Joe\\(s URL'
尝试使用以下命令读取相同内容时出现以下错误:
sh echo $DESC
错误:
2018-02-25 10:11:55,692 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1000: Error during parsing. Lexical error at line 8, column 13. Encountered: "(" (40), after : ""
但是,这种转义方法适用于下页提到的“%”和“=”等字符:
https://wiki.apache.org/pig/ParameterSubstitution
有没有办法在声明语句中转义诸如“(”和“)”之类的字符?我注意到同样的情况也适用于“'”。
【问题讨论】:
【参考方案1】:似乎括号不需要在 Pig 声明语句中转义。看这个玩具例子:
%declare DESC 'Joe(s URL'
A = LOAD ...
B = LIMIT A 2;
C = FOREACH B GENERATE '$DESC' AS var;
dump;
(Joe(s URL)
(Joe(s URL)
我还可以通过命令行将带括号的参数传递给 Pig,例如:
pig -f temp.pig -p DESC='Joe(s URL'
【讨论】:
感谢您的回复。好像我测试错了。 'sh echo $var' 不是测试它的正确方法,因为它会引发错误,但在代码中使用相同的声明变量可以正常工作。非常感谢。 我认为sh echo $var
通常是测试参数替换的好方法,但在这种特殊情况下,括号需要在 bash 而不是 Pig 中转义,因此即使参数替换成功,sh echo $var
也会失败在猪。
经过更多测试后,sh echo "$var"
似乎在 sh echo $var
和 sh echo '$var'
不起作用的地方工作。可能与使用单引号声明 var
然后将其用双引号括起来以传递给 bash 有关。
我尝试了所有 3 个选项,你提到过,但在所有三个选项中都出现错误。我附上了截图和上面的问题。如果我在这里遗漏了什么,请告诉我。
有趣!我不怀疑您遇到了错误-我怀疑它与不同版本的 Pig 有关,因为我在 0.16 中进行测试而您使用的是 0.12。也许这是一个已在较新版本中修复的错误。以上是关于在 Pig 声明语句中转义括号的主要内容,如果未能解决你的问题,请参考以下文章