Я использую Apache PIG для сокращения данных, первоначально сохраненных в формате CSV, и хочу вывести их в Avro. Часть моего скрипта PIG вызывает java UDF, который добавляет несколько полей во входной Tuple и передает измененный Tuple. При этом я изменяю вывод, PIG, схему, используя:
Schema outSchema = new Schema(input).getField(1).schema;
Schema recSchema = outSchema.getField(0).schema;
recSchema.add(new FieldSchema("aircrafttype", DataType.CHARARRAY));
Внутри public Schema outputSchema(Schema input)
моего UDF.
В рамках метода exec
я добавляю значения java.lang.String
к входному Tuple и возвращаю отредактированный Tuple в скрипт PIG. Это и все последующие операции работают нормально. Если я PigStorage(',')
формат CSV с помощью PigStorage(',')
, проблем нет. Когда я пытаюсь выполнить вывод, используя
STORE records INTO '$out_dir' USING org.apache.pig.piggybank.storage.avro.AvroStorage('
{
"schema":{
"type":"record", "name":"my new data",
"fields": [
{"name":"fld1", "type":"long"},
{"name":"fld2", "type":"string"}
]}
}');
Я получаю следующую ошибку:
java.io.IOException: java.lang.ClassCastException: java.lang.String cannot be cast to org.apache.avro.util.Utf8
Я попытался добавить поля символов в Tuple (внутри моего UDF) в виде char[]
и Utf8
, но это делает PIG сердитым, прежде чем я даже Utf8
записать данные. Я также попытался изменить мою схему Avro, чтобы допускать нулевые типы в каждом поле.
Я использую PIG v0.11.1 и Avro v1.7.5, любая помощь очень ценится.
Это была проблема с версией PIG. Мой UDF был встроен в jar-with-dependencies, включая PIG v0.8.1. Смешение PIG версий 0.8.1 и 0.11.1 вызывало проблемы, AVRO не имел к этому никакого отношения.