Подробное объяснение формата avro
Подробное объяснение формата avro

【Знакомство с Авро】

Apache Avro — это подпроект Hadoop и система сериализации данных. Его данные в конечном итоге хранятся в двоичном формате с использованием хранилища строк.

Авро обеспечивает:

  • Богатая структура данных
  • Сжимаемый, быстрый формат двоичных данных
  • Файл-контейнер, используемый для сохранения данных
  • удаленный вызов процедуры
  • Простая интеграция с динамическими языками, генерация кода не требует чтения или записи файлов данных или использования или реализации протоколов RPC. Генерация кода — это необязательная оптимизация, которую стоит реализовывать только в статически типизированных языках.

Основываясь на вышеперечисленных преимуществах, avro широко используется в системе Hadoop. Кроме того, avro также используется в Hudi и Iceberg как формат хранения метаданных.

【schema】

Avro использует «схему» (схему) для реализации определения структуры данных. Схема описывается и выражается через объекты json, а именно следующим образом:

  • Строка json, именующая определенный тип.
  • Объект json в формате `{"type":"typeName" ...attributes...}`, где `typeName` — это имя примитивного типа или сложное имя типа.
  • Массив json, представляющий объединение встроенных типов.

Типы в схеме состоят из примитивных типов (то есть базовых типов) (null, boolean, int, long, float, double, bytes и string) и сложных типов (запись, перечисление, массив, карта, объединение и т. д.). зафиксированный).

1. Оригинальный тип

К примитивным типам относятся следующие:

  • ноль: нет значения
  • логическое значение: значение логического типа
  • int: 32-битное целое число
  • длинный: 64-битное целое число
  • float: 32-битная с плавающей запятой
  • двойной: 64-битная с плавающей запятой
  • байты: 8-битный беззнаковый тип
  • строка: последовательность набора символов Юникода

У примитивного типа нет указанного значения атрибута, и имя примитивного типа также является именем определенного типа. Таким образом, «строка» в схеме эквивалентна {»type»:»string»}.

2, сложный тип

Avro поддерживает 6 сложных типов: записи, перечисления, массивы, карты, объединения и фиксированные.

1)Records

reocrds использует имя типа «запись» и поддерживает следующие свойства

  • name: строка json, содержащая имя записи (обязательно)
  • пространство имен: строка json, определяющая имя
  • doc: строка json, предоставляющая пользователю описание режима (необязательно).
  • псевдонимы: массив строк json для предоставления альтернативных имен для этой записи.
  • поля: массив json,Укажите все поля (обязательно),Каждое поле представляет собой объект json.,и содержит следующие атрибуты:
    • name: название поля (обязательно)
    • документ: описание поля (необязательно)
    • тип: схема, определенная, как указано выше.
    • default: значение поля по умолчанию
    • Порядок: определяет, как поле влияет на порядок сортировки записей. Допустимые значения: «по возрастанию» (значение по умолчанию), «по убыванию» и «игнорировать».
    • псевдонимы: псевдонимы

Простой пример:

Язык кода:javascript
копировать
{
    "type": "record",
    "name": "LongList",
    "aliases": ["LinkedLongs"],
    "fields", [
        {"name": "value", "type": "long"},
        {"name": "next", "type": ["null", "LongList"]}
    ]
}

2)Enums

Enum использует имя типа «enum» и поддерживает следующие свойства.

  • name: строка json, содержащая имя записи (обязательно)
  • пространство имен: строка json, определяющая имя
  • псевдонимы: массив строк json для предоставления альтернативных имен для этой записи.
  • doc: строка json, предоставляющая пользователю описание режима (необязательно).
  • символы: массив json, в котором перечислены символы в виде строк json. Каждый символ в перечислении должен быть уникальным и не может повторяться. Каждый символ должен соответствовать регулярному выражению «[A-Za-z_][A-Za-z0-9_]*».
  • default: значение по умолчанию для этого перечисления.

Пример:

Язык кода:javascript
копировать
{
    "type": "enum",
    "name": "Suit",
    "symbols": ["SPADES", "HEARTS", "DIAMONDS", "CLUBS"]
}

3) Arrays

  • item: схема элементов массива

Пример: объявить массив, значением которого является строка.

Язык кода:javascript
копировать
{
    "type": "array",
    "items": "string",
    "default": []
}

4)Maps

  • значения: Схема значения (значения) карты, ключ которой предполагается строкой.

Пример: объявить карту, значением которой является длинный тип (тип ключа — строка).

Язык кода:javascript
копировать
{
    "type": "map",
    "values": "long",
    "default": {}
}

5)Unions

Объединение представлено массивом json, например [null, «test»] объявляет шаблон, который может быть нулевым значением или строкой.

Следует отметить, что при указании значения по умолчанию для поля типа объединения тип значения по умолчанию должен соответствовать первому элементу объединения. Поэтому для объединения, содержащего «ноль», «ноль» обычно указывается первым, поскольку. этот тип Значение объединения по умолчанию обычно пусто.

Кроме того, объединение не может содержать несколько схем одного и того же типа, за исключением типов записи, фиксированной и EUM.

6)Fixed

Фиксированный использует имя типа «фиксированный» и поддерживает следующие свойства:

  • name: строка json, содержащая имя записи (обязательно)
  • пространство имен: строка json, определяющая имя
  • псевдонимы: массив строк json для предоставления альтернативных имен для этой записи.
  • doc: строка json, предоставляющая пользователю описание режима (необязательно).
  • размер: целое число, указывающее количество байтов для каждого значения (обязательно)

Например, 16-байтовое число можно объявить как:

Язык кода:javascript
копировать
{
    "type": "fixed",
    "name": "md5",
    "size": 16
}

[Формат хранения файлов Avro]

1. Кодирование данных

1) Примитивный тип

длянулевой тип:Контент не написан,То есть представление контента длиной 0 байт;

длялогический тип:к1Байты0или1выражатьfalseилиtrue;

дляint、long:кzigzagспособкодировка записи

дляfloat:Фиксированная длина 4 байта,Сначала преобразуйте в 32-битное целое число через floatToIntBits.,Затем напишите в кодировке с прямым порядком байтов.

дляdouble:зафиксированный8Длина байта,Сначала преобразуйте в 64-битное целое число через doubleToLongBits.,Затем напишите в кодировке с прямым порядком байтов.

дляbytes:Сначала напишите длину(использоватьzigzagкодировка записи),Затем идут двоичные данные содержания соответствующей длины.

дляstring:такой же Сначала напишите длину(использоватьzigzagкодировка записи),Затем запишите в строку двоичные данные, соответствующие utf8.

2) Сложный тип

дляenums:Просто нужноenumгде значениеIndexПросто закодируйте результат,Например,Значения перечисления: ["A", "B", "C", "D"],Тогда 0 означает «А».,3 означает «Д».

дляmaps:кодируется как серия блоков。Каждый блок состоит из длинного целого числа, представляющего количество пар ключ-значение.(использоватьzigzagкодировка записи),за которым следует несколько пар ключ-значение,Блок со счетом 0 указывает на конец карты. Каждый элемент кодируется в соответствии с соответствующим ему типом схемы.

дляarrays:иmapпохожий,Также кодируется как серия блоков,Каждый блок содержит количество длинных целых чисел.,Подсчет, за которым следует содержимое определенного элемента массива,Он заканчивается представлением блока со счетчиком 0. Каждый элемент в элементе массива кодируется в соответствии с соответствующим типом схемы.

дляunions:напиши сначалаlongКоличество типов представляет каждыйvalueномер позиции значения(начать с нуля),Затем значение кодируется по соответствующей схеме.

дляrecords:Следуйте напрямуюschemaдля кодирования полей в。

Для фиксированного: закодируйте экземпляр, используя количество байтов, определенное в схеме.

2. Формат хранения

В стандартном файле avro информация о схеме и соответствующее содержимое данных хранятся одновременно. Конкретный формат состоит из трех частей:

  • магическое число

Фиксированная длина 4 байта,Содержимое — символ «О».,'b','j',и идентификация номера версии,Обычно1

  • информация метаданных

Атрибуты метаданных файла, включая схему, метод сжатия данных и т. д. Весь атрибут метаданных кодируется и сохраняется в виде карты. Каждый атрибут сохраняется в форме KV. Имя атрибута соответствует ключу, а значение атрибута соответствует значению и сохраняется в форме. массив байтов. Наконец, случайная строка фиксированной длины в 16 байт идентифицирует конец метаданных.

  • Содержание данных

Содержимое данных состоит из одного или нескольких блоков данных. В начале каждого блока данных находится счетчик длинного типа (сохраненный в соответствии с зигзагообразным кодированием), указывающий, сколько фрагментов данных фактически содержится в блоке данных, за которым следует счетчик длинного типа, указывающий длину закодированных (N фрагментов) данных. Затем имеются фрагменты данных, хранящиеся в соответствии с кодировкой. В конце каждого блока данных находится 16-байтовая случайная строка, идентифицирующая конец блока.

Общее содержимое хранилища показано на рисунке ниже:

3. Формат хранения

Давайте сравним и проанализируем на практическом примере.

Сначала определите содержимое схемы, а именно таблицу с четырьмя полями: имя (строка), возраст (целое число), навыки (массив) и другие (тип карты). Подробности следующие:

Язык кода:javascript
копировать
{
    "type":"record",
    "name":"person",
    "fields": [
        {
            "name": "name",
            "type": "string"
        },
        {
            "name": "age",
            "type": "int"
        },
        {
            "name": "skill",
            "type": {
                "type":"array",
                "items": "string"
            }
        },
        {
            "name": "other",
            "type": {
                "type": "map",
                "values": "string"
            }
        }
    ]
}

Затем определите два фрагмента данных (person.json) согласно приведенной выше схеме:

Язык кода:javascript
копировать
{"name":"hncscwc","age":20,"skill":["hadoop","flink","spark","kafka"],"other":{"interests":"basketball"}}
{"name":"tom","age":18, "skill":["java","scala"],"other":{}}

Файл avro можно создать с помощью avro-tools:

Язык кода:javascript
копировать
java -jar avro-tools-1.7.4.jar fromjson --schema-file person.avsc person.json > person.avro

Просмотрите содержимое сгенерированного файла avro в двоичном режиме:

Кроме того, для существующего файла вы также можете просмотреть содержимое схемы и данных с помощью инструмента avro-tools.

Язык кода:javascript
копировать
[root@localhost avro]$ java -jar avro-tools-1.7.4.jar getschema ./person.avro
{
  "type" : "record",
  "name" : "person",
  "fields" : [ {
    "name" : "name",
    "type" : "string"
  }, {
    "name" : "age",
    "type" : "int"
  }, {
    "name" : "skill",
    "type" : {
      "type" : "array",
      "items" : "string"
    }
  }, {
    "name" : "other",
    "type" : {
      "type" : "map",
      "values" : "string"
    }
  } ]
}
[root@localhost avro]$ java -jar avro-tools-1.7.4.jar tojson ./person.avro
{"name":"hncscwc","age":20,"skill":["hadoop","flink","spark","kafka"],"other":{"interests":"basketball"}}
{"name":"tom","age":18,"skill":["java","scala"],"other":{}}

【краткое содержание】

В этой статье представлено подробное объяснение определения формата avro, метода кодирования и фактического формата хранимого файла, а также, наконец, приведено сравнительное объяснение на практическом примере. Кроме того, на официальном сайте также используются RPC и Mapreduce. Подробных объяснений здесь нет. Если вам интересно, вы можете зайти на официальный сайт и проверить это.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose