创建 pig udf 架构时遇到问题

Posted

技术标签:

【中文标题】创建 pig udf 架构时遇到问题【英文标题】:trouble creating a pig udf schema 【发布时间】:2014-04-17 22:01:02 【问题描述】:

尝试解析 xml,但我的 UDF 返回元组时遇到问题。仿照http://verboselogging.com/2010/03/31/writing-user-defined-functions-for-pig的例子

猪脚本

titles = FOREACH programs GENERATE (px.pig.udf.PARSE_KEYWORDS(program))
    AS (root_id:chararray, keyword:chararray);

这是输出模式代码:

 override def outputSchema(input: Schema): Schema = 
    try 
      val s: Schema = new Schema
      s.add(new Schema.FieldSchema("root_id", DataType.CHARARRAY))
      s.add(new Schema.FieldSchema("keyword", DataType.CHARARRAY))
      return s
    
    catch 
      case e: Exception => 
        return null
      
    
  

我收到了这个错误

pig script failed to validate: org.apache.pig.impl.logicalLayer.FrontendException: 
ERROR 0: Given UDF returns an improper Schema. 
Schema should only contain one field of a Tuple, Bag, or a single type. 
Returns: root_id: chararray,keyword: chararray

更新最终解决方案:

在java中

public Schema outputSchema(Schema input) 
    try 
        Schema tupleSchema = new Schema();
        tupleSchema.add(input.getField(1));
        tupleSchema.add(input.getField(0));
        return new Schema(new Schema.FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(),  input),tupleSchema, DataType.TUPLE));
     catch (Exception e) 
        return null;
    

【问题讨论】:

您能提供program 别名的示例输出吗? 它是 xml,例如"foo" 你能检查我答案底部的更新吗 【参考方案1】:

您需要将 s 架构实例变量添加到另一个架构对象。

尝试在下面的模板中返回new Schema(new FieldSchema(..., input), s, DataType.TUPLE));

这是我在 Java 中的答案(填写你的变量名):

@Override
    public Schema outputSchema(Schema input) 
        Schema tupleSchema = new Schema();
        try 

            tupleSchema.add(new FieldSchema("root_id", DataType.CHARARRAY));
            tupleSchema.add(new FieldSchema("keyword", DataType.CHARARRAY));

            return new Schema(new FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(), input), tupleSchema, DataType.TUPLE));
         catch (FrontendException e) 
            e.printStackTrace();
            return null;
        
    

你会试试:

titles = FOREACH programs GENERATE (px.pig.udf.PARSE_KEYWORDS(program));

如果没有错误,请尝试:

titles = FOREACH TITLES GENERATE
    $0 AS root_id
    ,$1 AS keyword
;

然后告诉我错误?

【讨论】:

现在我收到错误 ERROR 1031: Incompatable schema: left is "root_id:chararray,name:chararray", right is "px.pig.udf.parse_keywords_program_1:tuple(root_id:chararray,keyword:字符数组)" 按照您的建议从 pig 语句中删除架构会返回一个不同的错误:org.apache.pig.impl.logicalLayer.FrontendException: ERROR 1066: Unable to open iterator for alias Title 好的,通过将模式语句更改为 tupleSchema.add(input.getField(0));而不是 new FieldSchema... 并在 pig 脚本中取出模式声明 你能用一个完整的例子来更新你的代码吗?我无法让它工作。我得到“左边是......右边是”错误

以上是关于创建 pig udf 架构时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

Apache Pig - 在脚本中多次调用 Java UDF ToJSON

PIG UDF 错误 - 可以使用导入解决

Pig 版本和 UDF

在 Jython 的 Pig UDF 中导入外部库时出现错误 1121

JAVA 错误 1070 中的 PIG UDF

MySQL - 创建用户定义函数 (UDF) 时遇到问题