Ошибка при создании таблицы кустов из схемы avro - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь создать таблицу кустов, извлекая схему из данных Avro, которые хранятся в s3. Данные хранятся в s3 с использованием разъема s3 Kafka. Я публикую простой POJO для продюсера.

Код для извлечения схемы из данных Avro: -

for filename in os.listdir(temp_folder_path):
    filename = temp_folder_path + filename
        if filename.endswith('avro'):
            os.system(
                'java -jar /path/to/avro-jar/avro-tools-1.8.2.jar getschema {0} > {1}'.format(
                filename, filename.replace('avro', 'avsc')))

Извлеченная схема затем сохраняется в контейнере s3.

Создать запрос к таблице: -

CREATE EXTERNAL TABLE IF NOT EXISTS `db_name_service.table_name_change_log` PARTITIONED BY (`year` bigint,
 `month` bigint, `day` bigint, `hour` bigint) 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://bucket/topics/topic_name' 
 TBLPROPERTIES ( 'avro.schema.url'='s3://bucket/schemas/topic_name.avsc')

Ошибка: -

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: MetaException(message:org.apache.hadoop.hive.serde2.avro.AvroSerdeException Schema for table must be of type RECORD. Received type: BYTES)

Схема: -

{ "type": "record", "name": "Employee", "doc" : "Represents an Employee at a company", "fields": [ {"name": 
"firstName", "type": "string", "doc": "The persons given name"}, {"name": "nickName", "type": ["null",
 "string"], "default" : null}, {"name": "lastName", "type": "string"}, {"name": "age", "type": "int",
  "default": -1}, {"name": "phoneNumber", "type": "string"} ] }

Я вижу данные в темах, используя эту команду ./confluent-4.1.1/bin/kafka-avro-console-consumer --topic test2_singular --bootstrap-server localhost:9092 --from-beginning

{"firstName":"A:0","nickName":{"string":"C"},"lastName":"C","age":0,"phoneNumber":"123"}

{"firstName":"A:1","nickName":{"string":"C"},"lastName":"C","age":1,"phoneNumber":"123"}

1 Ответ

0 голосов
/ 04 сентября 2018

Схема для таблицы должна иметь тип RECORD. Полученный тип: БАЙТЫ

Единственный способ, которым это может произойти, - это если вы не используете AvroConverter для конфигурации приемника Connect.

Вы также захотите извлечь схему из файла S3.

Совет: использование функции Lambda для отслеживания создания авро-файлов в корзине может помочь в получении схем без сканирования всей корзины или случайных файлов. и могут использоваться для уведомления об обновлениях схемы таблиц Hive / AWS Glue

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...