我在S3存储桶中有一些文件,我通过Hive在它们上面创建了一个外部表。这些文件遵循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);
}
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')
当我尝试查看数据或仅在表上执行select语句时,出现以下错误:
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在本地进行反序列化而不会失败。