2016-03-01 92 views
0

我有一個Python UDF,它將十六進制數據轉換爲字符串。當我嘗試在多個字段上調用UDF時,出現錯誤。這是我的Python UDF。腳本是hex_to_str.pyPIG給出錯誤的Python UDF

#!/usr/bin/python 

@outputSchema("field:chararray") 
def hextoStr(field): 
if(field!=""): 
     return field.decode("hex") 

我打電話給我的豬腳本在下面的方式。

register file:/home/myuser/myfolder/hex_to_str.py using jython as convert; 
data = LOAD '/user/abc/hexfile' using PigStorage(',') as (Name:chararray, age:chararray); 
hex = foreach data generate convert.hextoStr(Name),convert.hextoStr(age); 
dump hex; 

這是我在運行腳本時遇到的錯誤。

INFO org.apache.pig.scripting.jython.JythonFunction - Schema 'field:chararray' defined for func hextoStr 
ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1108: 
<line 2, column 19> Duplicate schema alias: field 

日誌文件錯誤也沒有說太多。

<line 2, column 19> Duplicate schema alias: field 
     at org.apache.pig.newplan.logical.visitor.SchemaAliasVisitor.validate(SchemaAliasVisitor.java:75) 
     at org.apache.pig.newplan.logical.visitor.SchemaAliasVisitor.visit(SchemaAliasVisitor.java:105) 
     at org.apache.pig.newplan.logical.relational.LOGenerate.accept(LOGenerate.java:246) 

但是,如果我只在一個字段上運行相同的腳本,那麼它的工作原理。

register file:/home/myuser/myfolder/hex_to_str.py using jython as convert; 
data = LOAD '/user/abc/hexfile' using PigStorage(',') as (Name:chararray, age:chararray); 
hex = foreach data generate Name,convert.hextoStr(age); 
dump hex; 

回答

1

我懷疑這是因爲@outputSchema("field:chararray")裝飾指定UDF的名稱(別名)和數據類型(默認)。當您調用它兩次時,您在GENERATE中使用了兩次相同的別名,因此會出現Duplicate schema alias: field錯誤。

您可以運行兩個單獨的GENERATE s,但我懷疑如果您使用重新別名,則可以使用該功能兩次。

e.g東西沿着這些路線:

hex = foreach data generate convert.hextoStr(Name) as field1,convert.hextoStr(age) as field2;

然後每個結果都會有自己的別名,這個錯誤應該消失。如果沒有重新別名,Pig將無法​​區分您在GENERATE聲明中引用其他位置的結果。

效應初探從OP評論:

我懷疑,你可以在你喜歡的任何特定字符串替換裝飾field,但你仍必須調用它的問題,兩次使用兩個不同的領域相同的別名,所以你仍然需要重新別名。我不認爲有可能在裝飾器中使用一個變量,但在您的腳本中重新使用腳本可以獲得完整的動態效果。例如您可以將它們別名爲agename或類似名稱以匹配實際字段名稱。在

更多細節,它說,部分:

示例模式字符串 - y:{t:(word:chararray,num:long)},變量名 的模式字符串內未在任何地方使用,他們只是讓 語法識別解析器。

+0

感謝您的回覆。有什麼辦法可以在@outputSchema(「field:chararray」)中將實際的fieldName用於UDF。例如在我的情況下,有什麼辦法可以引用實際字段名稱(名稱或年齡)而不是字段 – DebD

+0

當然,沒問題。Pig中的重新鋸齒基本上完成了你所要求的,我認爲(從最終結果的角度來看)。有關更多詳細信息,請參閱上述答案中的編輯。是否有一個特定的原因,你不想在豬腳本中重新別名? – khampson

+0

沒有具體的原因,但我有一個包含3000多個字段的模式,我使用助手腳本爲此動態生成模式。在這種情況下,我很難生成別名。如果我可以在python UDF中處理它,那麼它變得很簡單。無論如何感謝您的幫助。 – DebD