Создать таблицу Hive из AVSC, которая содержит ссылку на ранее определенную схему как тип

Я ищу способ найти в Hive следующее содержимое файла AVSC и экстернализовать вложенную схему "RENTALRECORDTYPE" для повторного использования схемы.

{
    "type": "record",
    "name": "EMPLOYEE",
    "namespace": "",
    "doc": "EMPLOYEE is a person that works here",
    "fields": [
        {
            "name": "RENTALRECORD",
            "type": {
                "type": "record",
                "name": "RENTALRECORDTYPE",
                "namespace": "",
                "doc": "Rental record is a record that is kept on every item rented",
                "fields": [
                    {
                        "name": "due_date",
                        "doc": "The date when item is due",
                        "type": "int"
                    } 
                ]
            }
        },
        {
            "name": "hire_date",
            "doc": "Employee date of hire",
            "type": "int"
        }
    ]
}

Этот метод определения схемы работает отлично. Я могу выполнить следующую инструкцию HiveQL, и таблица успешно создана.

CREATE EXTERNAL TABLE employee
STORED AS AVRO
LOCATION '/user/dtom/store/data/employee'
TBLPROPERTIES ('avro.schema.url'='/user/dtom/store/schema/employee.avsc');

Однако я хочу иметь возможность ссылаться на существующую схему вместо дублирования определения записи в нескольких схемах. Например, вместо одного файла схемы будут сгенерированы два файла AVSC. то есть rentalrecord.avsc и employee.avsc.

rentalrecord.avsc

{
    "type": "record",
    "name": "RENTALRECORD",
    "namespace": "",
    "doc": "A record that is kept for every rental",
    "fields": [
        {
            "name": "due_date",
            "doc": "The date on which the rental is due back to the store",
            "type": "int"
        }
    ]
}

employee.avsc

{
    "type": "record",
    "name": "EMPLOYEE",
    "namespace": "",
    "doc": "EMPLOYEE is a person that works for the VIDEO STORE",
    "fields": [
        {
            "name": "rentalrecord",
            "doc": "A rental record is a record on every rental",
            "type": "RENTALRECORD"
        },
        {
            "name": "hire_date",
            "doc": "Employee date of hire",
            "type": "int"
        }
    ]
}

В приведенном выше сценарии мы хотим иметь возможность выводить определение схемы RENTALRECORD и использовать его повторно в employee.avsc и других местах.

При попытке импортировать схему, используя следующие два оператора HiveQL, происходит сбой…

CREATE EXTERNAL TABLE rentalrecord
STORED AS AVRO
LOCATION '/user/dtom/store/data/rentalrecord'
TBLPROPERTIES ('avro.schema.url'='/user/dtom/store/schema /rentalrecord.avsc');

CREATE EXTERNAL TABLE employee
STORED AS AVRO
LOCATION '/user/dtom/store/data/employee'
TBLPROPERTIES ('avro.schema.url'='/user/dtom/store/schema/employee.avsc');

Rentalrecord.avsc успешно импортирован, но employee.avsc завершается ошибкой в ​​первом определении поля. Поле типа "RENTALRECORD". Следующая ошибка выводится Hive...

СБОЙ: Ошибка выполнения, код возврата 1 из org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: MetaException(message:org.apache.hadoop.hive.serde2.SerDeException Схема определения исключительной ситуации. Схема возвращаемого сигнала, указывающая на проблему: "RENTALRECORD" не является определенным именем. Тип поля "rentalrecord") должно быть определенным именем или выражением {"type": ...}.)

Мое исследование говорит мне, что файлы Avro поддерживают эту форму повторного использования схемы. Так что либо я что-то упускаю, либо это то, что не поддерживается через Hive.

Любая помощь будет принята с благодарностью.

1 ответ

Я определил AVDL со всеми ссылками, а затем использовал jar-файл avro tools с опцией idl2schemata для генерации avsc. Сгенерированный avsc работал как шарм с ульем!!

Другие вопросы по тегам