Apache pig 创建pig udf架构时遇到问题
尝试解析xml时,我的UDF返回元组时遇到问题。仿效 猪字Apache pig 创建pig udf架构时遇到问题,apache-pig,Apache Pig,尝试解析xml时,我的UDF返回元组时遇到问题。仿效 猪字 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
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}
更新最终解决方案:
在爪哇
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;
}
}
您需要将
s
schema实例变量添加到另一个schema对象
尝试返回一个新模式(newfieldschema(…,input),s,DataType.TUPLE))代码>如以下模板中所示:
以下是我的Java答案(填写变量名):
请你试试:
titles = FOREACH programs GENERATE (px.pig.udf.PARSE_KEYWORDS(program));
如果没有出现错误,请尝试:
titles = FOREACH TITLES GENERATE
$0 AS root_id
,$1 AS keyword
;
然后告诉我错误?现在我得到错误1031:不兼容模式:左边是“root\u id:chararray,name:chararray”,右边是“px.pig.udf.parse\u keywords\u program\u 1:tuple(root\u id:chararray,keyword:chararray)”按照建议从pig语句中删除架构将返回另一个错误:org.apache.pig.impl.logicalayer.FrontendException:错误1066:无法打开别名titlesok的迭代器,将架构语句更改为tupleSchema.add(input.getField(0));而不是新的FieldSchema。。。去掉pig脚本中的模式声明,您能用一个完全工作的示例更新代码吗?我不能让它工作。我得到“left is…right is”错误您能给出程序
别名的示例输出吗?它是xml,例如“foo”您能检查我答案底部的更新吗
titles = FOREACH TITLES GENERATE
$0 AS root_id
,$1 AS keyword
;