我在我的智慧結尾試圖解決這個問題。我有腳本和UDF與豬0.8.1完美運行,但是當我嘗試用豬0.10.0運行,我得到:由於改變豬版本0.10.0導致Apache Pig錯誤2218
ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2218: Invalid resource schema: bag schema must have tuple as its field
從豬腳本調用UDF的代碼如下所示:
parsed = LOAD '$INPUT'
USING pignlproc.storage.ParsingWikipediaLoader('$LANG')
AS (title, id, pageUrl, text, redirect, links, headers, paragraphs);
的ParsingWikipediaLoader類實現LoadMetaData和的getSchema()方法是這樣的:
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工作與豬0.8.1預期,因此這版本之間必須有所不同。我已經徹底搜索了,但在文檔或Stack Overflow中找不到關於此的任何信息。
非常感謝!我將每個包裹在一個Tuple中,現在它就像一個魅力一樣。這個解決方案實際上已經發生在我身上,但是我已經讓包裝稍微錯了,所以腳本中的所有別名都被搞砸了。做得好! – chokamp