2013-08-06 94 views
1

我想讀取豬腳本中的屬性。其他一些工作爲該財產產生價值並將其寫在hdfs上。用於聲明語句的UDF

我試着用下面的腳本,它的工作原理。

%declare a com.company.Check(); 
x = LOAD '1' using PigStorage('^A') as (b:chararray); 
y = FOREACH x GENERATE b, $a ; 

但是,當我在UDF通過了paremeter,該pigscript失敗。

%declare a com.comapny.Check($p); 
x = LOAD '1' using PigStorage('^A') as (b:chararray); 
y = FOREACH x GENERATE b, $a ; 

有人可以幫我嗎?

+0

它是怎麼失敗的?你能發佈錯誤消息嗎? – mr2ert

+0

錯誤消息:錯誤1000:分析過程中出錯。無效的別名:com在{b:chararray}中。 實際上,我將一個hdfs路徑(/ a/b/c)作爲paremeter傳遞給豬,這在腳本中被稱爲'p'。 udf只讀了第一行並返回。 –

回答

0

這並沒有爲我工作,要麼,所以我決定運行shell命令而不是

%DECLARE devices_path `echo "$device_input" | sed 's/^.*devices\///'` 

我同意,這不是解決問題的真正的Java方法,但嘿它的工作原理!

1

%declare的用例是用其他(s)來描述一個參數。
您可以使用%declare來創建自定義函數的別名,但此無關 與選擇要使用正確的構造函數(如果你嘗試這樣做,你最終會與 語法錯誤)

在他們的構造函數的參數

自定義負載功能可以與聲明,因爲在他們的聲明點別名, (後using),你基本上定義自己的構造函數來使用,所以你可以在這裏傳遞所需的參數,例如:

register '/path/to/my.jar'; 
%declare loader 'MyLoader'; 
A = load 'data.txt' using loader('$p') as (f1:chararray); 
... 

但是,這個ap proc不適用於UDF s,因爲在腳本的聲明點您將字段,元組等等傳遞給它們的exec方法。 (它們已經用默認的noarg構造函數實例化)

我建議您改用DEFINE來代替。按照Pig docs

Use DEFINE to specify a UDF function when: 
- ... 
- The constructor for the function takes string parameters 

E.g:

register '/path/to/my.jar'; 
DEFINE a com.comapny.Check('$p'); 
x = LOAD '1' using PigStorage('^A') as (b:chararray); 
y = FOREACH x GENERATE b, $a;