У меня есть несколько файлов в корзине S3, и я создал внешнюю таблицу поверх них с помощью Hive. Файлы придерживаются формата Avro.
Я могу десериализовать эти файлы локально по той же схеме, на которую я ссылаюсь, и она работает без проблем:
Java Код для десериализации Avro
Schema schema = new Schema.Parser().parse(new File("schema_path.avsc"));
DatumReader<SpecificRecord> datumReader = new SpecificDatumReader<>(schema);
DataFileReader<SpecificRecord> dataFileReader = new DataFileReader<>(new File("avro_file.avro"), datumReader);
SpecificRecord record = null;
while (dataFileReader.hasNext()) {
record = dataFileReader.next(record);
System.out.println(record);
}
Таблица Hive Создание
CREATE EXTERNAL TABLE `test_db.test_avro_table`
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
LOCATION
's3://dir/data/'
TBLPROPERTIES (
'avro.schema.url'='s3://dir/schema.avsc')
Когда я пытаюсь просмотреть данные или просто выполнить оператор выбора для таблицы, я получаю следующую ошибку:
Error in fetching data rows: *org.apache.hive.service.cli.HiveSQLException:java.io.IOException: org.apache.avro.AvroTypeException: Found com.class.thing, expecting union:44:43;
Я не понимаю, почему десериализация выполняется локально с помощью Java будет работать без сбоев, используя тот же файл и ту же схему, на которую я ссылаюсь в этом тесте.