在 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 $varsh echo '$var' 不起作用的地方工作。可能与使用单引号声明 var 然后将其用双引号括起来以传递给 bash 有关。 我尝试了所有 3 个选项,你提到过,但在所有三个选项中都出现错误。我附上了截图和上面的问题。如果我在这里遗漏了什么,请告诉我。 有趣!我不怀疑您遇到了错误-我怀疑它与不同版本的 Pig 有关,因为我在 0.16 中进行测试而您使用的是 0.12。也许这是一个已在较新版本中修复的错误。

以上是关于在 Pig 声明语句中转义括号的主要内容,如果未能解决你的问题,请参考以下文章

如何在 URI 中转义大括号

SQL语句中转义字符怎么写?

SQL语句中转义字符怎么写

在 bash 脚本中转义引号和大括号的问题

在 PL/SQL Developer 中转义 & 符号

在 Java 中转义 MySQL 字符串...没有准备好的语句