创建PIG UDF模式时遇到问题

4
尝试解析XML时,我的UDF返回元组时遇到了问题。参考http://verboselogging.com/2010/03/31/writing-user-defined-functions-for-pig中的示例。
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”别名的一个样例输出吗? - Matthew Moisen
它是XML,例如“<program rootId =”10000“> <keyword> foo </ keyword> </ program>” - MonkeyBonkey
你能检查我回答底部的更新吗? - Matthew Moisen
1个回答

5

您需要将s模式实例变量添加到另一个Schema对象中。

尝试返回类似于以下模板的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: 不兼容的模式:左侧是 "root_id:chararray,name:chararray",右侧是 "px.pig.udf.parse_keywords_program_1:tuple(root_id:chararray,keyword:chararray)"。 - MonkeyBonkey
按照您的建议从pig语句中删除模式后,返回了不同的错误:org.apache.pig.impl.logicalLayer.FrontendException: ERROR 1066:无法为别名titles打开迭代器。 - MonkeyBonkey
好的,通过将模式语句更改为tupleSchema.add(input.getField(0));而不是new FieldSchema...,并在pig脚本中删除模式声明,我已经使其工作。 - MonkeyBonkey
你能否更新你的代码,并提供一个完全可工作的示例?我无法让它正常工作。我遇到了“left is ... right is”错误。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接