Создать таблицу 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 работал как шарм с ульем!!