Формат загрузки данных
Содержание раздела
Структура сообщений
Данные загружаются в систему в виде сообщений топиков Kafka. Каждое сообщение имеет структуру, показанную на рисунке ниже.
Формат данных
Для успешной загрузки данные должны соответствовать следующим условиям:
- Данные представлены в виде сообщений топика Kafka.
- Каждое сообщение состоит из ключа и тела. Требования к ключу сообщения не предъявляются.
- Тело сообщения представляет собой файл Avro (Object Container File), который состоит из заголовка и блоков данных.
- Заголовок файла содержит схему данных Avro.
- Схема данных содержит следующие элементы: имя, тип “record” и перечень полей. Для каждого поля указано имя, а также тип данных Avro из перечисленных в разделе Загружаемые типы данных.
- Если данные предназначены для логических таблиц, последним полем схемы должно быть указано служебное поле
sys_op
с типом данных avro.int. В данных, предназначенных для standalone-таблиц, полеsys_op
должно отсутствовать. - Каждый блок данных содержит запись, представленную в бинарной кодировке. Запись соответствует схеме данных из заголовка файла Avro.
- Каждая запись содержит перечень полей и их значений. Имена и порядок перечисления полей, а также типы данных их значений соответствуют схеме данных.
- Если данные предназначены для логических таблиц, в каждой записи последним полем должно быть указано служебное поле
sys_op
со значением 0 (если нужно добавить новую или обновить существующую запись) или 1 (если нужно удалить существующую запись). В данных, предназначенных для standalone-таблиц, полеsys_op
должно отсутствовать. - Состав и порядок полей совпадают во всех следующих объектах:
- в схеме данных заголовка файла Avro,
- в наборе загружаемых записей,
- во внешней таблице загрузки (поле
sys_op
должно отсутствовать), - в таблице-приемнике данных (поле
sys_op
должно отсутствовать).
В загружаемой схеме данных Avro и записях Avro важны порядок и тип полей. Имена полей не сравниваются с именами полей внешней таблицы и таблицы-приемника.
В схеме данных можно использовать логические типы Avro, а также элементы unions (см. пример ниже). Типы данных Avro, доступные к загрузке в систему, описаны в разделе Загружаемые типы данных.
Подробнее о формате Avro см. в официальной документации на сайте https://avro.apache.org.
Примеры
Пример сообщения, загружаемого в логическую таблицу
Пример схемы данных Avro
Пример ниже содержит схему данных Avro, используемую для загрузки данных о продажах в логическую таблицу sales
. Для поля transaction_date
указан логический тип Avro, для поля description
— элемент union.
Для наглядности примера бинарные данные представлены в JSON-формате.
{
"name": "sales",
"type": "record",
"fields": [
{
"name": "id",
"type": "long"
},
{
"name": "transaction_date",
"type": "long",
"logicalType": "timestamp-micros"
},
{
"name": "product_code",
"type": "string"
},
{
"name": "product_units",
"type": "long"
},
{
"name": "store_id",
"type": "long"
},
{
"name": "description",
"type": [
"null",
"string"
]
},
{
"name": "sys_op",
"type": "int"
}
]
}
Пример записей Avro
Пример ниже содержит набор записей о продажах, загружаемых в логическую таблицу sales
. Для наглядности примера бинарные данные представлены в JSON-формате.
[
{
"id": 1000111,
"transaction_date": 1614269474000000,
"product_code": "ABC102101",
"product_units": 2,
"store_id": 1000012345,
"description": "Покупка по акции 1+1",
"sys_op": 0
},
{
"id": 1000112,
"transaction_date": 1614334214000000,
"product_code": "ABC102001",
"product_units": 1,
"store_id": 1000000123,
"description": "Покупка без акций",
"sys_op": 0
},
{
"id": 1000020,
"transaction_date": 1614636614000000,
"product_code": "ABC102010",
"product_units": 4,
"store_id": 1000000123,
"description": "Покупка по акции 1+1",
"sys_op": 1
}
]
Пример сообщения, загружаемого в standalone-таблицу
Пример схемы данных Avro
Пример ниже содержит схему данных Avro, используемую для загрузки данных в standalone-таблицу, на которую указывает внешняя writable-таблица agreements_ext_write_adp
. Для полей signature_date
, effective_date
и closing_date
указан логический тип Avro, для поля description
— элемент union.
Для наглядности примера бинарные данные представлены в JSON-формате.
{
"name": "agreements",
"type": "record",
"fields": [
{
"name": "id",
"type": "long"
},
{
"name": "client_id",
"type": "long"
},
{
"name": "number",
"type": "string"
},
{
"name": "signature_date",
"type": {
"type": "int",
"logicalType": "date"
}
},
{
"name": "effective_date",
"type": {
"type": "int",
"logicalType": "date"
}
},
{
"name": "closing_date",
"type": {
"type": "int",
"logicalType": "date"
}
},
{
"name": "description",
"type":
[
"null",
"string"
]
}
]
}
Пример записей Avro
Пример ниже содержит набор записей, загружаемых в standalone-таблицу, на которую указывает внешняя writable-таблица agreements_ext_write_adp
. Для наглядности примера бинарные данные представлены в JSON-формате.
[
{
"id": 1000111,
"client_id": 1614200,
"number": "ABC102101",
"signature_date": 18594,
"effective_date": 18594,
"closing_date": 22974,
"description": "Договор с ООО \"Треугольник\""
},
{
"id": 1000112,
"transaction_date": 1614201,
"number": "ABC102101",
"signature_date": 18704,
"effective_date": 18704,
"closing_date": 23084,
"description": ""
}
]