2013-04-26 182 views
0

我想在我的豬腳本通過一個過濾器語句中使用參數替代空白字符

對於我試圖

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

我已經試過flt='\'a1==1 AND a2=2\''flt="a1==1 AND a2==2"由apache論壇中的pig用戶建議以及在SO中看到類似的帖子。

任何幫助將不勝感激

回答

1

我覺得你使用過,因爲它是作爲條件的參數。如果是這樣你會得到這樣的錯誤。相反,您可以將它們作爲單獨的參數來傳遞,並在豬腳本中形成條件字符串。

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

在您的filterscript.pig腳本中,您可以在條件子句中使用這些參數值。例如

a1==$p1 AND a2=$p2 
+0

感謝您的答覆。是的,我知道。看到一些有趣的東西http://stackoverflow.com/questions/12501537/how-can-i-pass-command-line-parameters-with-whitespace-to-an-apache-pig-script,那就是爲什麼要這樣。針對這些問題提出了許多JIRA問題,並且所有問題都已關閉。據他們說,他們支持這種解釋方式。 – abhi 2013-04-26 08:44:45

+0

謝謝。那很有意思。所以我認爲你應該使用-param「flt ='a1 == 1 AND a2 = 2'」。它對你有用嗎? – Rags 2013-04-26 08:59:32

+0

耶試過...不爲我工作 – abhi 2013-04-26 09:00:51

1

如果你運行你的腳本繁重的外殼外,你可以做以下內容:

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

其中filterscript.pig是這樣的:

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

注意,'='是也逃脫了,否則過濾條件不會被評估爲布爾值。

如果您想在使用exec, 嘗試使用grunt shell中的過濾器替換,那麼您將遇到空白問題。由於轉義空白字符不工作,作爲一種解決方法,您可以創建一個parameter file

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

然後問題:

exec -param_file params.txt filterscript.pig 

注:我用的豬0.12

+0

感謝您的答覆。我已經從grunt外殼嘗試過了,它顯示'ERROR 2999:意外的內部錯誤。在命令行遇到意外的參數 - 請檢查命令行。我已經在調試模式下運行它,輸出替代文件'f = filter p by a1;',這意味着如果我只是通過'flt =「a1 \ = \ = 1」',它就能夠替代直到a1 – abhi 2013-04-26 10:33:03

+0

,那麼替換後的文件看起來像'f = filter a by a1 == 1' – abhi 2013-04-26 10:36:11

+0

您可以發佈您執行的命令嗎?我剛剛檢查了版本0.9.2,它的工作原理。 – 2013-04-26 10:51:50