Python UDF for PIG Giving错误

时间:2016-03-01 23:30:59

标签: python hadoop apache-pig user-defined-functions udf

我有一个Python UDF,可以将数据从Hex转换为字符串。当我尝试在多个字段上调用UDF时,我收到错误。这是我的Python UDF。脚本是hex_to_str.py

#!/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 个答案:

答案 0 :(得分:1)

我怀疑这是因为@outputSchema("field:chararray")装饰器指定 UDF 的名称(别名)和数据类型(默认情况下)。当您拨打两次电话时,您在GENERATE中使用了两次相同的别名,因此会出现Duplicate schema alias: field错误。

您可以运行两个单独的GENERATE,但我怀疑如果您重新别名,您将能够使用该功能两次。

例如:

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

然后每个结果都有自己的别名,该错误应该消失。如果没有重新别名, Pig 就无法区分您在GENERATE语句中引用的其他结果。

回应OP的评论:

我怀疑你可以用你喜欢的任何特定字符串替换装饰器中的field,但你仍然会遇到使用相同的别名在两个不同字段上调用它两次的问题,所以你会仍然需要重新别名。我不认为可以在装饰器中使用变量,但在 Pig 脚本中重新混叠可以实现完全动态。例如您可以将它们设为agename或类似名称,以匹配实际的字段名称。

有关Python UDFs的更多详情,部分内容如下:

  

示例架构字符串 - y:{t:(word:chararray,num:long)},变量名称   在一个模式字符串里面没有在任何地方使用,他们只是做   语法可以解析为。