Формат загрузки данных

Содержание раздела
  1. Структура сообщений
  2. Формат данных
  3. Примеры
    1. Пример сообщения, загружаемого в логическую таблицу
      1. Пример схемы данных Avro
      2. Пример записей Avro
    2. Пример сообщения, загружаемого в standalone-таблицу
      1. Пример схемы данных Avro
      2. Пример записей Avro

Структура сообщений

Данные загружаются в систему в виде сообщений топиков Kafka. Каждое сообщение имеет структуру, показанную на рисунке ниже.

Структура загружаемых сообщений

Формат данных

Система не валидирует данные при их загрузке. Данные должны быть проверены на соответствие формату загрузки и, если нужно, скорректированы внешней системой перед их загрузкой в Prostore.

Для успешной загрузки данные должны соответствовать следующим условиям:

  • Данные представлены в виде сообщений топика 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": ""
  }
]