Apache pig 更改为Pig版本0.10.0导致Apache Pig错误2218
我在想办法解决这个问题。我有一些脚本和UDF可以在Pig 0.8.1中完美运行,但是当我尝试在Pig 0.10.0中运行时,我得到:Apache pig 更改为Pig版本0.10.0导致Apache Pig错误2218,apache-pig,Apache Pig,我在想办法解决这个问题。我有一些脚本和UDF可以在Pig 0.8.1中完美运行,但是当我尝试在Pig 0.10.0中运行时,我得到: ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2218: Invalid resource schema: bag schema must have tuple as its field 从Pig脚本调用UDF的代码如下所示: parsed = LOAD '$INPUT' USING pignl
ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2218: Invalid resource schema: bag schema must have tuple as its field
从Pig脚本调用UDF的代码如下所示:
parsed = LOAD '$INPUT'
USING pignlproc.storage.ParsingWikipediaLoader('$LANG')
AS (title, id, pageUrl, text, redirect, links, headers, paragraphs);
public ResourceSchema getSchema(String location, Job job)
throws IOException {
Schema schema = new Schema();
schema.add(new FieldSchema("title", DataType.CHARARRAY));
schema.add(new FieldSchema("id", DataType.CHARARRAY));
schema.add(new FieldSchema("uri", DataType.CHARARRAY));
schema.add(new FieldSchema("text", DataType.CHARARRAY));
schema.add(new FieldSchema("redirect", DataType.CHARARRAY));
Schema linkInfoSchema = new Schema();
linkInfoSchema.add(new FieldSchema("target", DataType.CHARARRAY));
linkInfoSchema.add(new FieldSchema("begin", DataType.INTEGER));
linkInfoSchema.add(new FieldSchema("end", DataType.INTEGER));
schema.add(new FieldSchema("links", linkInfoSchema, DataType.BAG));
Schema headerInfoSchema = new Schema();
headerInfoSchema.add(new FieldSchema("tagname", DataType.CHARARRAY));
headerInfoSchema.add(new FieldSchema("begin", DataType.INTEGER));
headerInfoSchema.add(new FieldSchema("end", DataType.INTEGER));
schema.add(new FieldSchema("headers", headerInfoSchema, DataType.BAG));
Schema paragraphInfoSchema = new Schema();
paragraphInfoSchema.add(new FieldSchema("tagname", DataType.CHARARRAY));
paragraphInfoSchema.add(new FieldSchema("begin", DataType.INTEGER));
paragraphInfoSchema.add(new FieldSchema("end", DataType.INTEGER));
schema.add(new FieldSchema("paragraphs", paragraphInfoSchema,
DataType.BAG));
return new ResourceSchema(schema);
}
ParsingWikipediaLoader类实现,getSchema()方法如下所示:
parsed = LOAD '$INPUT'
USING pignlproc.storage.ParsingWikipediaLoader('$LANG')
AS (title, id, pageUrl, text, redirect, links, headers, paragraphs);
public ResourceSchema getSchema(String location, Job job)
throws IOException {
Schema schema = new Schema();
schema.add(new FieldSchema("title", DataType.CHARARRAY));
schema.add(new FieldSchema("id", DataType.CHARARRAY));
schema.add(new FieldSchema("uri", DataType.CHARARRAY));
schema.add(new FieldSchema("text", DataType.CHARARRAY));
schema.add(new FieldSchema("redirect", DataType.CHARARRAY));
Schema linkInfoSchema = new Schema();
linkInfoSchema.add(new FieldSchema("target", DataType.CHARARRAY));
linkInfoSchema.add(new FieldSchema("begin", DataType.INTEGER));
linkInfoSchema.add(new FieldSchema("end", DataType.INTEGER));
schema.add(new FieldSchema("links", linkInfoSchema, DataType.BAG));
Schema headerInfoSchema = new Schema();
headerInfoSchema.add(new FieldSchema("tagname", DataType.CHARARRAY));
headerInfoSchema.add(new FieldSchema("begin", DataType.INTEGER));
headerInfoSchema.add(new FieldSchema("end", DataType.INTEGER));
schema.add(new FieldSchema("headers", headerInfoSchema, DataType.BAG));
Schema paragraphInfoSchema = new Schema();
paragraphInfoSchema.add(new FieldSchema("tagname", DataType.CHARARRAY));
paragraphInfoSchema.add(new FieldSchema("begin", DataType.INTEGER));
paragraphInfoSchema.add(new FieldSchema("end", DataType.INTEGER));
schema.add(new FieldSchema("paragraphs", paragraphInfoSchema,
DataType.BAG));
return new ResourceSchema(schema);
}
同样,脚本和UDF在Pig 0.8.1中的工作与预期的一样,因此这两个版本之间必须存在一些差异。我已经彻底搜索过了,但在文档或堆栈溢出中找不到任何关于这方面的信息 看起来区别在于
ResourceFieldSchema
构造函数
0.8.1检测一个包并将内部模式包装在元组中,而此逻辑已从0.10.0中删除。我想您需要修改模式定义,将包模式封装在元组中:
schema.add(new FieldSchema("links", new Schema(
new FieldSchema("t", linkInfoSchema)), DataType.BAG));
但是,在0.8.1上使用时,这会在类似元组的模式中生成元组:
- 0.10.0:
{title:chararray,id:chararray,uri:chararray,text:chararray,redirect:chararray,links:{t:(target:chararray,begin:int,end:int)},headers:{t:(tagname:chararray,begin:int,end:int)},段落:{t:(tagname:chararray,begin:int,end:int)}
- 0.8.1:
{title:chararray,id:chararray,uri:chararray,text:chararray,redirect:chararray,links:{t:(t:(target:chararray,begin:int,end:int))},headers:{t:(t:(tagname:chararray,begin:int,end:int))},段落:{t:(t:(t:(tagname:chararray,begin:int,end:int))}
Schema linkInfoSchema = new Schema();
linkInfoSchema.add(new FieldSchema("target", DataType.CHARARRAY));
linkInfoSchema.add(new FieldSchema("begin", DataType.INTEGER));
linkInfoSchema.add(new FieldSchema("end", DataType.INTEGER));
Schema linkInfoSchemaTupleWrapper = new Schema(new FieldSchema("t",
linkInfoSchema));
linkInfoSchemaTupleWrapper.setTwoLevelAccessRequired(true);
schema.add(new FieldSchema("links", linkInfoSchemaTupleWrapper, DataType.BAG));
然后生成0.10.0和0.8.1之间的相同模式:
{title:chararray,id:chararray,uri:chararray,text:chararray,redirect:chararray,链接:{t:(target:chararray,begin:int,end:int)},标题:{t:(tagname:chararray,begin:int,end:int)},段落:{t:(tagname:chararray,begin:int,end:int)}
{title:chararray,id:chararray,uri:chararray,text:chararray,redirect:chararray,链接:{t:(target:chararray,begin:int,end:int)},标题:{t:(tagname:chararray,begin:int,end:int)},段落:{t:(tagname:chararray,begin:int,end:int)}
0.10.0:
/**
* Construct using a {@link org.apache.pig.impl.logicalLayer.schema.Schema.FieldSchema} as the template.
* @param fieldSchema fieldSchema to copy from
*/
public ResourceFieldSchema(FieldSchema fieldSchema) {
type = fieldSchema.type;
name = fieldSchema.alias;
description = "autogenerated from Pig Field Schema";
Schema inner = fieldSchema.schema;
// allow partial schema
if ((type == DataType.BAG || type == DataType.TUPLE || type == DataType.MAP)
&& inner != null) {
schema = new ResourceSchema(inner);
} else {
schema = null;
}
}
0.8.1
/**
* Construct using a {@link org.apache.pig.impl.logicalLayer.schema.Schema.FieldSchema} as the template.
* @param fieldSchema fieldSchema to copy from
*/
public ResourceFieldSchema(FieldSchema fieldSchema) {
type = fieldSchema.type;
name = fieldSchema.alias;
description = "autogenerated from Pig Field Schema";
Schema inner = fieldSchema.schema;
if (type == DataType.BAG && fieldSchema.schema != null
&& !fieldSchema.schema.isTwoLevelAccessRequired()) {
log.info("Insert two-level access to Resource Schema");
FieldSchema fs = new FieldSchema("t", fieldSchema.schema);
inner = new Schema(fs);
}
// allow partial schema
if ((type == DataType.BAG || type == DataType.TUPLE)
&& inner != null) {
schema = new ResourceSchema(inner);
} else {
schema = null;
}
}
非常感谢!我把每个袋子包成一个元组,现在它就像一个符咒。我确实想到了这个解决方案,但是我把包装器弄错了,所以脚本中的所有别名都搞错了。干得好!