Hive не может десериализовать файлы AVRO, но десериализация работает локально - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть несколько файлов в корзине 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 будет работать без сбоев, используя тот же файл и ту же схему, на которую я ссылаюсь в этом тесте.

...