<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>маршалинг - DataTalks.RU. Data Engineering / DWH / Data Pipeline</title>
	<atom:link href="https://datatalks.ru/tag/%d0%bc%d0%b0%d1%80%d1%88%d0%b0%d0%bb%d0%b8%d0%bd%d0%b3/feed/" rel="self" type="application/rss+xml" />
	<link>https://datatalks.ru/tag/маршалинг/</link>
	<description>RoadMap для инженера данных. Дорожная карта по инструментам Data Engineer</description>
	<lastBuildDate>Sun, 14 Sep 2025 07:37:53 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://datatalks.ru/wp-content/uploads/2024/12/cropped-logo_datatalks-32x32.png</url>
	<title>маршалинг - DataTalks.RU. Data Engineering / DWH / Data Pipeline</title>
	<link>https://datatalks.ru/tag/маршалинг/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Процессы сериализации и десериализации данных. Форматы сериализации</title>
		<link>https://datatalks.ru/data-serialization-and-deserialization/</link>
					<comments>https://datatalks.ru/data-serialization-and-deserialization/#respond</comments>
		
		<dc:creator><![CDATA[Data Engineer (Admin)]]></dc:creator>
		<pubDate>Sun, 15 Jun 2025 18:44:00 +0000</pubDate>
				<category><![CDATA[Data Engineering]]></category>
		<category><![CDATA[Avro]]></category>
		<category><![CDATA[BSON]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JSONL]]></category>
		<category><![CDATA[Parquet]]></category>
		<category><![CDATA[Protobuf]]></category>
		<category><![CDATA[Thrift]]></category>
		<category><![CDATA[YAML]]></category>
		<category><![CDATA[демаршалинг]]></category>
		<category><![CDATA[Десериализация]]></category>
		<category><![CDATA[маршалинг]]></category>
		<category><![CDATA[Сериализация]]></category>
		<guid isPermaLink="false">https://datatalks.ru/?p=844</guid>

					<description><![CDATA[<p>Введение в сериализацию Что такое сериализация и десериализация? Сериализация (маршалинг) — это процесс преобразования структуры данных или объекта в формат (текстовый или бинарный), пригодный для хранения или передачи (например, в файл, по сети или в базу данных) в рамках взаимодействия между различными системами и/или языками программирования. Форматы сериализации бывают в виде текста (например, JSON, XML, [&#8230;]</p>
<p>Сообщение <a href="https://datatalks.ru/data-serialization-and-deserialization/">Процессы сериализации и десериализации данных. Форматы сериализации</a> появились сначала на <a href="https://datatalks.ru">DataTalks.RU. Data Engineering / DWH / Data Pipeline</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Введение в сериализацию</h1>
<h2>Что такое сериализация и десериализация?</h2>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/serialization_deserialization.jpeg"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-1508" src="https://datatalks.ru/wp-content/uploads/2025/06/serialization_deserialization.jpeg" alt="" width="1138" height="579" srcset="https://datatalks.ru/wp-content/uploads/2025/06/serialization_deserialization.jpeg 1138w, https://datatalks.ru/wp-content/uploads/2025/06/serialization_deserialization-300x153.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/serialization_deserialization-1024x521.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2025/06/serialization_deserialization-768x391.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/serialization_deserialization-450x229.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/serialization_deserialization-780x397.jpeg 780w" sizes="(max-width: 1138px) 100vw, 1138px" /></a></p>
<p><strong>Сериализация (маршалинг)</strong> — это процесс преобразования структуры данных или объекта в формат (текстовый или бинарный), пригодный для хранения или передачи (например, в файл, по сети или в базу данных) в рамках взаимодействия между различными системами и/или языками программирования. Форматы сериализации бывают в виде текста (например, <code>JSON</code>, <code>XML</code>, <code>YAML</code>) или в бинарном виде (например, <code>Protobuf</code>, <code>Avro</code>, <code>Thrift</code>, <code>BSON</code>).</p>
<p><strong>Главная цель сериализации:</strong> Сделать сложную структуру данных переносимой и пригодной к восстановлению, независимо от среды исполнения (язык, платформа, система).</p>
<p><strong>Десериализация (демаршалинг)</strong> — это процесс реконструкции структуры данных или объекта из его сериализованной формы. Он включает в себя интерпретацию сериализованных данных и создание эквивалентного объекта или структуры данных.</p>
<p><strong>Цель десериализации:</strong> Получить рабочую структуру данных из сохранённого/переданного формата и использовать её в коде на любом языке.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/serialization_process.jpeg"><img decoding="async" class="aligncenter size-full wp-image-1509" src="https://datatalks.ru/wp-content/uploads/2025/06/serialization_process.jpeg" alt="" width="971" height="191" srcset="https://datatalks.ru/wp-content/uploads/2025/06/serialization_process.jpeg 971w, https://datatalks.ru/wp-content/uploads/2025/06/serialization_process-300x59.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/serialization_process-768x151.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/serialization_process-450x89.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/serialization_process-780x153.jpeg 780w" sizes="(max-width: 971px) 100vw, 971px" /></a></p>
<p><span style="color: #ff6600;"><strong>Почему сериализация важна</strong></span></p>
<ul>
<li><strong>Унификация данных:</strong> Форматы сериализации создают единый стандарт, который понимают разные языки и системы.</li>
<li><strong>Межъязыковое взаимодействие:</strong> Службы на Python, Java, Go и других языках могут обмениваться данными, если они сериализованы в понятный им формат (например, JSON, Protobuf).</li>
<li><strong>Устойчивость к хранению:</strong> Сериализация позволяет сохранять состояние объектов (например, в файлах, кэше или базах) и восстанавливать их позже.</li>
<li><strong>Гибкость:</strong> можно сериализовать &#8212; <strong>примитивы</strong> (строки, числа), <strong>сложные структуры</strong> (списки, словари, объекты), и даже <strong>связи между объектами</strong> (в некоторых форматах, например Pickle или Thrift).</li>
</ul>
<h3><strong>Сериализация vs Маршалинг</strong></h3>
<p>Хотя термины сериализация и маршалинг часто используются как взаимозаменяемые, для разных людей они могут иметь немного разное значение. В некоторых кругах сериализация касается только части перевода, в то время как маршалинг также касается перемещения данных из одного места в другое.</p>
<p>Точное значение каждого термина зависит от того, кого вы спрашиваете. Например, программисты Java склонны использовать слово «маршалинг» в контексте удаленного вызова методов (RMI). В Python «маршалинг» относится почти исключительно к формату, используемому для хранения скомпилированных инструкций байт-кода.</p>
<p>Статья на вики <a href="https://en.wikipedia.org/wiki/Marshalling_(computer_science)#Comparison_with_serialization" target="_blank" rel="noopener">&#171;Marshalling Comparison with serialization&#187;</a>.</p>
<h3><strong>Как работает сериализация: из структуры — в байты/текст — обратно</strong></h3>
<p>Когда программа работает, данные хранятся в оперативной памяти в виде объектов, структур, массивов и т.д. Эти данные нужно преобразовать во внешний формат, пригодный для хранения или передачи. После сериализации структура становится линейной — последовательностью символов или байтов, которую можно передать или сохранить.</p>
<p>Когда нужно использовать эти данные снова — они десериализуются, то есть преобразуются обратно в структуру, понятную языку программирования.</p>
<p><strong>Обобщённая схема:</strong></p><pre class="urvanov-syntax-highlighter-plain-tag">[ Объект / структура данных ]
           ↓ сериализация
[ Линейный формат: JSON / байты / XML ]
           ↓ (отправка / хранение)
[ Передача / сохранение / чтение из файла ]
           ↓ десериализация
[ Объект / структура данных (в памяти) ]</pre><p></p>
<h2>Форматы сериализации</h2>
<p>В распоряжении инженеров данных имеется множество алгоритмов и форматов сериализации. Хотя обилие вариантов становится серьезным источником проблем при выполнении инженерии данных, они также открывают широкие возможности для повышения производительности. Мы сталкивались с ситуациями, когда производительность работы повышалась в 100 раз просто за счет перехода сериализации от <code>CSV</code> к <code>Parquet</code>. По мере продвижения данных по конвейеру инженеры также будут управлять <strong>повторной сериализацией</strong> &#8212; преобразованием данных из одного формата в другой. Иногда инженерам данных не остается ничего кроме принятия данных в древнем, неприглядном виде. Они должны разработать <strong>процессы десериализации</strong> этого формата и обработки исключений, а затем очистить и преобразовать данные для согласованной и быстрой последующей обработки и потребления.</p>
<h3>Сериализация на основе строк</h3>
<p>Как следует из названия, <strong>сериализация на основе строк</strong> организует данные по строкам. Формат CSV представляет собой архетипический формат на основе строк. Для полуструктурированных данных (объектов данных, поддерживающих вложенность и вариативность схемы) сериализация на основе строк подразумевает хранение каждого объекта как единицы.</p>
<h4><strong>CSV: Нестандартный стандарт</strong></h4>
<p>Это формат сериализации, заслуживший нелюбовь инженеров данных. <strong>Термин CSV (Comma-Separated Values &#8212; файлы данных с разделителями-запятыми)</strong> &#8212; это, по сути, общее обозначение разделенного текста, но существует гибкость в соглашениях об экранировании, символах кавычек, разделителях и т.д.</p>
<p>Инженерам данных следует избегать использования СSV-файлов в конвейерах, поскольку они подвержены большому количеству ошибок и имеют низкую производительность. Инженерам часто приходится использовать формат CSV для обмена данными с неподконтрольными им системами и бизнес-процессами. CSV стал распространенным форматом для архивирования данных. Если вы используете CSV для архивирования, включите полное техническое описание конфигурации сериализации для ваших файлов, чтобы будущие потребители могли получить эти данные.</p>
<h4><strong>XML</strong></h4>
<p><strong>Расширяемый язык разметки (Extensible Markup Language, XML)</strong> был популярен во времена появления HTML и Интернета, но сейчас он рассматривается как устаревший. Он, как правило, медленно десериализуется и сериализуется для приложений из сферы инженерии данных. <strong>XML</strong> &#8212; еще один стандарт, с которым часто приходится взаимодействовать инженерам данных при обмене данными с унаследованными системами и программным обеспечением. JSON в значительной степени заменил XML для сериализации объектов в виде обычного текста.</p>
<h4><strong>JSON и JSONL</strong></h4>
<p><strong>JavaScript Object Notation (JSON)</strong> стал новым стандартом для обмена данными через API, а также чрезвычайно популярным форматом для хранения данных. В контексте баз данных популярность JSON начала быстро расти с появлением <strong>MongoDB</strong> и других хранилищ документов. Такие базы данных, как <strong>Snowtlake</strong>, <strong>BigQuery</strong> и <strong>SQL Server</strong>, также имеют широкую встроенную поддержку, что облегчает обмен данными между приложениями, API и системами баз данных.</p>
<p><strong>JSON Lines (JSONL) </strong>&#8212; это специализированная версия JSON для хранения объемных полуструктурированных данных в файлах. JSONL хранит последовательность JSОN-объектов, причем объекты разграничиваются разрывами строк. Чрезвычайно удобный формат для хранения данных сразу после их что JSONL &#8212; поглощения из API или приложений. Однако многие столбцовые форматы обеспечивают значительно более высокую производительность. Рассмотрите возможность перехода на другой формат для промежуточных этапов конвейера и предоставления данных.</p>
<p><strong>Пример JSONL:</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/jsonl.jpeg"><img decoding="async" class="aligncenter size-full wp-image-1511" src="https://datatalks.ru/wp-content/uploads/2025/06/jsonl.jpeg" alt="" width="1276" height="403" srcset="https://datatalks.ru/wp-content/uploads/2025/06/jsonl.jpeg 1276w, https://datatalks.ru/wp-content/uploads/2025/06/jsonl-300x95.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/jsonl-1024x323.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2025/06/jsonl-768x243.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/jsonl-450x142.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/jsonl-780x246.jpeg 780w" sizes="(max-width: 1276px) 100vw, 1276px" /></a></p>
<h4><strong>Avro</strong></h4>
<p><strong>Avro</strong> &#8212; это формат данных на основе строк. Он предназначен для выполнения <code>RPC</code> и сериализации данных. <strong>Avro</strong> кодирует данные в двоичный формат, а метаданные схемы указываются в формате <strong>JSON</strong>.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/avro.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1513" src="https://datatalks.ru/wp-content/uploads/2025/06/avro.jpeg" alt="" width="913" height="348" srcset="https://datatalks.ru/wp-content/uploads/2025/06/avro.jpeg 913w, https://datatalks.ru/wp-content/uploads/2025/06/avro-300x114.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/avro-768x293.jpeg 768w, https://datatalks.ru/wp-content/uploads/2025/06/avro-450x172.jpeg 450w, https://datatalks.ru/wp-content/uploads/2025/06/avro-780x297.jpeg 780w" sizes="(max-width: 913px) 100vw, 913px" /></a></p>
<p>Avro популярен в экосистеме Hadoop, а также поддерживается различными инструментами для работы с облачными данными.</p>
<h3><strong>Сериализация столбцов</strong></h3>
<p>Рассмотренные до сих пор форматы сериализации ориентированы на работу со строками. Данные кодируются в виде полных отношений (XML и JSON), последовательно записываемых в файлы.<br />
При сериализации столбцов, организация данных, по сути, сводится к хранению каждого столбца в отдельном наборе файлов. Одним из очевидных преимуществ хранения на основе столбцов можно считать возможность считывания данных только из подмножества полей, а не выполнять считывание сразу всех строк. Такой сценарий часто встречается в аналитических приложениях и позволяет значительно сократить объем данных, требующих сканирования для выполнения запроса.</p>
<p>При хранении данных в виде столбцов одинаковые значения также располагаются рядом друг с другом, что позволяет эффективно кодировать столбцовые данные.</p>
<p>Один из распространенных методов &#8212; поиск повторяющихся значений и их токенизация. Это простой, но очень эффективный метод сжатия для столбцов с большим числом повторений.<br />
Даже если столбцы не содержат большого количества повторяющихся значений, в них может наблюдаться высокая избыточность. Предположим, что мы организовали сообщения службы поддержки клиентов в один столбец данных. Скорее всего, в этих сообщениях мы снова и снова будем встречать одни и те же темы и словосочетания, что позволяет алгоритмам сжатия данных достичь высокого коэффициента. По этой причине хранение на основе столбцов обычно сочетается со сжатием, что позволяет максимально эффективно использовать ресурсы диска и пропускной способности сети.</p>
<p><strong>У хранения на основе столбцов и сжатия есть и определенные недостатки.</strong></p>
<p>Отсутствие возможности легко получить доступ к отдельным записям данных влечет за собой необходимость восстанавливать записи путем считывания данных из нескольких файлов на основе столбцов.</p>
<p>Изменение записей также сопряжено с определенными трудностями. Чтобы изменить одно поле в одной записи, мы должны распаковать файл на основе столбцов, изменить его, снова запаковать и записать обратно в хранилище. Чтобы избежать полной перезаписи столбцов при каждом обновлении, столбцы разбиваются на множество файлов, обычно с использованием стратегий разбиения и кластеризации. Таким образом можно организовать данные в соответствии с шаблонами запросов и изменений для таблицы. Но даже в этом случае накладные расходы на обновление одной строки просто чудовищны.</p>
<p>Базы данных на основе столбцов плохо подходят для транзакционных рабочих нагрузок, поэтому в транзакционных базах данных обычно используется та или иная форма хранения, ориентированная на строки или записи.</p>
<h4><strong>Parquet</strong></h4>
<p><strong>Parquet</strong> хранит данные в формате столбцов и предназначен для обеспечения отличной производительности чтения и записи в среде озера данных. Формат Parquet решает несколько часто возникающих у инженеров данных проблем.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/parquet_file.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1515" src="https://datatalks.ru/wp-content/uploads/2025/06/parquet_file.png" alt="" width="1148" height="945" srcset="https://datatalks.ru/wp-content/uploads/2025/06/parquet_file.png 1148w, https://datatalks.ru/wp-content/uploads/2025/06/parquet_file-300x247.png 300w, https://datatalks.ru/wp-content/uploads/2025/06/parquet_file-1024x843.png 1024w, https://datatalks.ru/wp-content/uploads/2025/06/parquet_file-768x632.png 768w, https://datatalks.ru/wp-content/uploads/2025/06/parquet_file-450x370.png 450w, https://datatalks.ru/wp-content/uploads/2025/06/parquet_file-780x642.png 780w" sizes="(max-width: 1148px) 100vw, 1148px" /></a></p>
<p>В отличие от CSV, данные в кодировке Parquet содержат информацию о схеме и поддерживают вложенные данные.</p>
<p>Кроме того, Parquet &#8212; переносимый формат: если такие базы данных, как BigQuery и Snowflake, сериализуют данные в собственных форматах на основе столбцов и обеспечивают отличную производительность запросов к данным, хранящимся внутри, то при взаимодействии с внешними инструментами происходит огромный спад производительности. Данные должны быть десериализованы, пересортированы в удобный для обмена формат и экспортированы для использования таких инструментов для работы с озерами данных, как Spark и Presto.</p>
<p>Раrquеt-файлы в озере данных могут оказаться лучшим вариантом по сравнению с запатентованными облачными хранилищами данных в многоязыковой инструментальной среде.<br />
Формат Parquet используется с различными алгоритмами сжатия, особенно популярны оптимизированные по скорости алгоритмы, такие как <code>Snappy</code> (рассматривается далее в этом приложении).</p>
<h4><strong>ORC</strong></h4>
<p><strong>Optimized Row Columnar (ORC)</strong> &#8212; это столбцовый формат хранения данных, аналогичный Parquet. ORC был очень популярен в системе Apache Hive. Хотя он по прежнему широко используется, в целом мы видим его гораздо реже, чем Apache Parquet, и он пользуется несколько меньшей поддержкой в современных инструментах облачной экосистемы. Например, <strong>Snowtlake</strong> и <strong>BigQuery</strong> поддерживают импорт и экспорт файлов Parquet. Они также могут считывать данные из файлов ORC, но ни один из указанных инструментов не может экспортировать их в этот формат.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/orc_file.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1516" src="https://datatalks.ru/wp-content/uploads/2025/06/orc_file.png" alt="" width="1119" height="1058" srcset="https://datatalks.ru/wp-content/uploads/2025/06/orc_file.png 1119w, https://datatalks.ru/wp-content/uploads/2025/06/orc_file-300x284.png 300w, https://datatalks.ru/wp-content/uploads/2025/06/orc_file-1024x968.png 1024w, https://datatalks.ru/wp-content/uploads/2025/06/orc_file-768x726.png 768w, https://datatalks.ru/wp-content/uploads/2025/06/orc_file-450x425.png 450w, https://datatalks.ru/wp-content/uploads/2025/06/orc_file-780x737.png 780w" sizes="(max-width: 1119px) 100vw, 1119px" /></a></p>
<h4><strong>Apache Arrow или сериализация в памяти</strong></h4>
<p>Программное обеспечение может хранить данные в сложных объектах, разбросанных по памяти и связанных указателями, или в более упорядоченных, плотно упакованных структурах, таких как массивы в Фортране и Си.</p>
<p>Как правило, плотно упакованные структуры данных в памяти ограничивались простыми типами (например, фиксированной ширины (например, строками INT64) или структурами данных фиксированной ширины).</p>
<p>Более сложные структуры (например, JSОN-документы) не могут плотно храниться в памяти и требуют сериализации для хранения и передачи между системами.</p>
<p>Идея фреймворка Apache Arrow 1 заключается в том, чтобы переосмыслить сериализацию,  используя формат данных, подходящий как для обработки в памяти, так и для экспорта.</p>
<p>Это позволяет избежать накладных расходов на сериализацию и десериализацию &#8212; мы просто используем один и тот же формат для обработки в памяти, экспорта по сети и долговременного хранения. Arrow базируется на столбцовом хранении, где каждый столбец, по сути, получает свои собственные фрагменты памяти. Для вложенных данных мы используем технику измельчения, помогающую сопоставлять каждое место в схеме JSОN-документов с отдельным столбцом.</p>
<p>Эта техника означает, что можно хранить файл данных на диске, передавать его непосредственно в адресное пространство программы, используя виртуальную память, и начинать выполнять запрос к данным без накладных расходов на десериализацию. Фактически мы можем подкачивать фрагменты файла в память помере его сканирования, а затем выгружать их обратно, чтобы избежать нехватки памяти при работе с большими наборами данных.</p>
<p>Одно из очевидных неудобств при таком подходе заключается в том, что разные языки программирования по-разному сериализуют данные. Для решения этой проблемы в рамках проекта Arrow были созданы программные библиотеки для различных языков программирования (включая С, Go, Java, JavaScript, МА TLAB, Python, R и Rust), позволяющие этим языкам взаимодействовать с данными Arrow в памяти.</p>
<p>В некоторых случаях эти библиотеки используют интерфейс между выбранным языком и низкоуровневым кодом на другом языке (например, С) для чтения и записи из Arrow. Это обеспечивает высокую совместимость между языками без дополнительных накладных расходов на сериализацию.</p>
<p>Например, программа на языке Scala может использовать библиотеку Java для записи данных Arrow, а затем передать их в виде сообщения программе на языке Python.</p>
<p>Arrow быстро находит применение в различных популярных фреймворках, таких как Apache Spark. Компания Arrow также выпустила новый продукт для хранения данных &#8212; Dremio. Он представляет собой платформу, состоящую из системы запросов и хранилища данных, построенную на основе сериализации Arrow для поддержки быстрых запросов.</p>
<h3><strong>Гибридная сериализация</strong></h3>
<p>Мы используем термин «гибридная сериализация» для обозначения технологий, сочетающих несколько методов сериализации или интегрирующих сериализацию с дополнительными уровнями абстракции, такими как управление схемами. В качестве примеров приведем <code>Apache Hudi</code> и <code>Apache Iceberg</code>.</p>
<h4><strong>Hudi</strong></h4>
<p><strong>Hudi означает Hadoop Upserts Deletes Incrementals.</strong> Эта технология управления таблицами сочетает в себе несколько методов сериализации, что обеспечивает производительность столбцовых баз данных при аналитических запросах и одновременно поддерживает Hudi &#8212; атомарные, транзакционные обновления.</p>
<p><strong>Типичное приложение &#8212; это таблица, обновляемая из потока CDC, поступающего из базы данных транзакционного приложения.</strong> Поток перехватывается в формате сериализации, ориентированном на строки, а основная часть таблицы сохраняется в столбцовом формате. Запрос работает как со столбцами, так и со строками, возвращая результаты для текущего состояния таблицы. Периодически выполняется процесс переупаковки, объединяющий строковые и столбцовые файлы в обновленные файлы на основе столбцов для повышения эффективности запросов.</p>
<h4><strong>lceberg</strong></h4>
<p><strong>Iceberg представляет собой технологию управления таблицами.</strong> Iceberg может отслеживать все файлы, составляющие таблицу. Этот формат также позволяет отслеживать файлы в каждом моментальном снимке таблицы с течением времени, что дает возможность перемещаться во времени по таблице в среде озера данных. <strong>lceberg</strong> поддерживает эволюцию схемы и может легко управлять таблицами петабайтного масштаба.</p>
<p>По Iceberg рекомендую статью <a href="https://ivan-shamaev.ru/apache-iceberg-tutorial-architecture-how-to-work/" target="_blank" rel="noopener">&#171;Введение в Apache Iceberg. Основы, архитектура, как работает?&#187;</a></p>
<h2>Другие форматы</h2>
<h3><strong>Protocol Buffers (Protobuf)</strong></h3>
<p><strong>Protocol Buffers (или Protobuf)</strong> — это бинарный формат сериализации данных, разработанный Google. Он позволяет эффективно и компактно описывать и передавать структурированные данные между программами, особенно в распределённых и микросервисных системах.</p>
<p>Работает это примерно следующим образом:</p>
<ul>
<li>Пишется структура данных в <code>.proto</code>-файле.</li>
<li>С помощью <code>protoc</code> (компилятора) генерируются классы для нужного языка.</li>
<li>Эти классы позволяют сериализовать и десериализовать данные в бинарный формат.</li>
</ul>
<p><strong>Пример <code>.proto</code> файла:</strong></p><pre class="urvanov-syntax-highlighter-plain-tag">syntax = "proto3";

package events;

// Время — всегда полезно для потоков
import "google/protobuf/timestamp.proto";

message OrderEvent {
  string order_id = 1;
  string user_id = 2;
  repeated OrderItem items = 3;
  double total_amount = 4;
  google.protobuf.Timestamp created_at = 5;
  OrderStatus status = 6;
}

message OrderItem {
  string product_id = 1;
  int32 quantity = 2;
  double price = 3;
}

enum OrderStatus {
  UNKNOWN = 0;
  PENDING = 1;
  CONFIRMED = 2;
  SHIPPED = 3;
  CANCELLED = 4;
}</pre><p></p>
<h3><strong>FlatBuffers</strong></h3>
<p><strong>FlatBuffers</strong> &#8212; Бинарный формат сериализации от Google, как альтернатива Protobuf.</p>
<ul>
<li>Не требует десериализации — можно читать напрямую из байтовой строки (zero-copy).</li>
<li>Рекомендуется использовать в играх, мобильных и встраиваемых приложениях, где важна скорость и низкий overhead.</li>
<li>Быстрее всего, но сложнее в использовании и изменении схемы.</li>
</ul>
<h3><strong>CBOR (Concise Binary Object Representation)</strong></h3>
<p><strong>CBOR</strong> &#8212; Бинарная версия JSON, стандартизированная (RFC 8949).</p>
<ul>
<li>Компактнее JSON, но сохраняет его структуру и семантику.</li>
<li>Применяется в IoT, веб-протоколы (CoAP), когда нужен JSON‑like формат, но без избыточности.</li>
<li>Хороший компромисс: читаемость + компактность + универсальность.</li>
</ul>
<h3><strong>MessagePack</strong></h3>
<p><strong>MessagePack</strong> &#8212; Бинарный формат сериализации, максимально совместимый с JSON по структуре.</p>
<ul>
<li>В 2–5 раз меньше JSON, при этом так же прост для использования.</li>
<li>Используется в клиент-серверном общении, кэшировании, REST/gRPC, Redis (поддерживает MessagePack).</li>
<li>&#171;JSON, но быстрее и легче&#187; — удобен, если не нужна строгая схема.</li>
</ul>
<h3><strong>pickle</strong></h3>
<p><strong>pickle</strong> — это встроенный модуль сериализации в Python, предназначенный для сохранения и восстановления объектов Python в байтовом виде.</p>
<p><strong>Используется в следующих сценариях:</strong></p>
<ul>
<li>Быстро сохранить объект Python на диск (например, модель машинного обучения).</li>
<li>Кэшировать данные между запусками.</li>
<li>Локальная отладка и временные файлы.</li>
</ul>
<h3><strong>BSON (Binary JSON)</strong></h3>
<p><strong>BSON</strong> — это бинарный формат, разработанный MongoDB. Он расширяет JSON, добавляя поддержку дополнительных типов (например, даты, бинарные данные) и более эффективную машинную обработку.</p><pre class="urvanov-syntax-highlighter-plain-tag">$ hexdump -C atom.bson | head
00000000  51 d2 01 00 03 66 65 65  64 00 46 d2 01 00 02 40  |Q....feed.F....@|
00000010  78 6d 6c 6e 73 00 1c 00  00 00 68 74 74 70 3a 2f  |xmlns.....http:/|
00000020  2f 77 77 77 2e 77 33 2e  6f 72 67 2f 32 30 30 35  |/www.w3.org/2005|
00000030  2f 41 74 6f 6d 00 02 74  69 74 6c 65 00 0c 00 00  |/Atom..title....|
00000040  00 52 65 61 6c 20 50 79  74 68 6f 6e 00 04 6c 69  |.Real Python..li|
00000050  6e 6b 00 72 00 00 00 03  30 00 3f 00 00 00 02 40  |nk.r....0.?....@|
00000060  68 72 65 66 00 20 00 00  00 68 74 74 70 73 3a 2f  |href. ...https:/|
00000070  2f 72 65 61 6c 70 79 74  68 6f 6e 2e 63 6f 6d 2f  |/realpython.com/|
00000080  61 74 6f 6d 2e 78 6d 6c  00 02 40 72 65 6c 00 05  |atom.xml..@rel..|
00000090  00 00 00 73 65 6c 66 00  00 03 31 00 28 00 00 00  |...self...1.(...|</pre><p><strong>Рекомендуется применять при:</strong></p>
<ul>
<li>При работе с MongoDB.</li>
<li>Если нужен более мощный JSON (с типами, датами, бинарными данными).</li>
<li>Для API, где бинарный формат предпочтительнее текстового, но всё ещё нужен JSON‑подобный вид.</li>
</ul>
<h2>Бессхемный против основанного на схеме (Schemaless vs Schema-Based)</h2>
<p>Независимо от того, являются ли они текстовыми или бинарными, многие форматы сериализации данных требуют документ схемы , который является формальным описанием ожидаемой структуры сериализованных данных. В то же время некоторые форматы не имеют схемы, в то время как другие могут работать как со схемой, так и без нее:</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/06/schemaless_schema_based.jpeg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1531" src="https://datatalks.ru/wp-content/uploads/2025/06/schemaless_schema_based.jpeg" alt="" width="591" height="192" srcset="https://datatalks.ru/wp-content/uploads/2025/06/schemaless_schema_based.jpeg 591w, https://datatalks.ru/wp-content/uploads/2025/06/schemaless_schema_based-300x97.jpeg 300w, https://datatalks.ru/wp-content/uploads/2025/06/schemaless_schema_based-450x146.jpeg 450w" sizes="(max-width: 591px) 100vw, 591px" /></a></p>
<h2>Подсистема хранения базы данных</h2>
<p><strong>Во всех базах данных есть базовый механизм хранения данных.</strong> Многие СУБД не представляют свои механизмы хранения данных в виде отдельной абстракции (например, <strong>BigQuery</strong>, <strong>Snowflake</strong>). Некоторые из них (в частности, MySQL) поддерживают полностью подключаемые механизмы хранения данных.</p>
<p>Другие (например, SQL Server) предлагают основные варианты конфигурации механизма хранения (столбцовое или строчное хранение), существенно влияющие на поведение базы данных.<br />
Как правило, механизм хранения данных представляет собой отдельный от механизма запросов программный уровень.</p>
<p>Механизм хранения управляет всеми аспектами хранения данных на диске, включая сериализацию, физическое расположение данных и индексы.</p>
<p>В 2000-2010-х годах в подсистемах хранения данных появились значительные инновации. Если раньше подсистемы хранения данных были оптимизированы для прямого доступа к вращающимся дискам, то современные системы гораздо лучше оптимизированы для поддержки характеристик производительности твердотельных накопителей. Подсистемы хранения также обеспечивают улучшенную поддержку современных типов и структур данных, таких как строки переменной длины, массивы и вложенные данные.</p>
<p>Еще одним важным изменением в подсистемах хранения данных стал переход к системам хранения на основе столбцов для приложений аналитики и хранилищ данных. Такие СУБД, как SQL Server, PostgreSQL и MySQL, обеспечивают надежную поддержку хранилищ на основе столбцов.</p>
<h2>Сжатие: gzip, bzip2, Snappy и т.д.</h2>
<p>Математика, лежащая в основе алгоритмов сжатия, сложна, но основную идею понять легко &#8212; <strong>алгоритмы сжатия ищут избыточность и повторы в данных, а затем перекодируют их для уменьшения избыточности.</strong></p>
<p>Когда требуется прочитать исходные данные, мы распаковываем их, меняя алгоритм на противоположный и помещая избыточность обратно. Например, вы заметили, что при чтении этой книги некоторые слова встречаются неоднократно. Проведя быстрый анализ текста, можно определить наиболее часто встречающиеся слова и создать для них сокращенные лексемы. Для сжатия необходимо заменить общие слова на их лексемы, а для распаковки &#8212; заменить лексемы на соответствующие им слова.</p>
<p>Возможно, с помощью этого наивного приема можно было бы реализовать коэффициент сжатия в соотношении 2 к 1 и более. Алгоритмы сжатия используют более сложные математические методы для выявления и устранения избыточности.</p>
<p>Зачастую они позволяют достичь коэффициента сжатия в соотношении 1О:1 для текстовых данных.</p>
<p>Заметим, что речь идет об <strong>алгоритмах сжатия без потерь</strong>. При декомпрессии данных, закодированных по алгоритму сжатия без потерь, восстанавливается бит в бит точная копия исходных данных.</p>
<p><strong>Алгоритмы сжатия с потерями для аудио, изображений и видео</strong> нацелены на сенсорную точность &#8212; при декомпрессии восстанавливается то, что звучит или выглядит как оригинал, но не является его точной копией. Инженеры данных могут сталкиваться с алгоритмами сжатия с потерями в конвейерах обработки мультимедиа, но не с сериализацией для аналитики, где требуется высочайшая достоверность данных.</p>
<p>Традиционные механизмы сжатия, такие как <code>gzip</code> и <code>bzip2</code>, очень хорошо сжимают текстовые данные. Их часто применяют для работы с <code>JSON</code>, <code>JSONL</code>, <code>XML</code>, <code>CSV</code> и другими текстовыми форматами данных.</p>
<p>В последние годы инженеры создали новое поколение алгоритмов сжатия, в которых приоритет отдается скорости и эффективности процессора, а не степени сжатия. Основными примерами служат <code>Snappy</code>, <code>Zstandard</code>, <code>LZFSE</code> и <code>LZ4</code>. Эти алгоритмы часто используются для сжатия в озерах данных или столбчатых базах данных с целью оптимизации быстродействия запросов.</p>
<h1>Сценарии использования сериализации</h1>
<h2>REST API</h2>
<p>В веб-приложениях клиент (браузер, мобильное приложение) общается с сервером через HTTP-запросы.</p>
<ul>
<li>Сервер отвечает сериализованными данными — чаще всего в JSON.</li>
<li>Клиент десериализует ответ и отображает его.</li>
</ul>
<p><strong>Пример:</strong></p><pre class="urvanov-syntax-highlighter-plain-tag">GET /users/1
→ Ответ:
{ "id": 1, "name": "Alice", "email": "alice@example.com" }</pre><p></p>
<ul>
<li>Python (FastAPI, Django REST) → JSON</li>
<li>Node.js (Express) → JSON</li>
<li>Java (Spring) → JSON/XML</li>
</ul>
<h2>Микросервисы</h2>
<p>В архитектуре микросервисов данные передаются между сервисами (например, аутентификация, платежи, каталог товаров).</p>
<p>Каждый сервис может быть написан на разном языке</p>
<p><strong>Данные передаются через:</strong></p>
<ul>
<li>REST (JSON)</li>
<li>gRPC (Protobuf)</li>
<li>Kafka (Avro, JSON, Protobuf)</li>
</ul>
<p><strong>Пример:</strong></p>
<p>Сервис заказов отправляет сериализованный заказ в сервис оплаты через Kafka в формате Avro или JSON.</p>
<h2>Распределённые системы</h2>
<p>Системы, разбитые на несколько узлов (кластеров, машин), требуют обмена данными между компонентами.</p>
<p>Пример: база данных (Cassandra, Redis), кэш, очереди (RabbitMQ, Kafka)</p>
<p><strong>Сериализация нужна для:</strong></p>
<ul>
<li>передачи объектов между узлами,</li>
<li>репликации,</li>
<li>логирования событий.</li>
</ul>
<p>Пример: Kafka брокер получает сообщение в Protobuf, десериализует его, и передаёт другому сервису.</p>
<h2>Big Data и Data Pipelines</h2>
<p>В системах обработки больших данных сериализация используется при:</p>
<ul>
<li>Чтении/записи файлов в HDFS или S3 (форматы: Avro, Parquet)</li>
<li>Передаче данных через Apache Kafka, Spark, Flink и др.</li>
<li>Поддержании схемы данных (schema registry)</li>
</ul>
<p><strong>Пример:</strong> ETL-пайплайн получает CSV, преобразует его в Avro, затем пишет в Parquet на Hadoop. Apache Spark читает Parquet-файл — десериализация.</p>
<h1>Литература для дополнительного ознакомления</h1>
<ul>
<li><a href="https://lectures.ostrov.ski/assets/pdf/25-persistence-beamer.pdf" target="_blank" rel="noopener">Хранение данных. Сериализация и объектно-реляционные</a><br />
отображения pdf (лекция)</li>
<li><a href="https://github.com/enhorse/java-interview/blob/master/serialization.md" target="_blank" rel="noopener">Вопросы для собеседования &#8212; Сериализация</a></li>
<li><a href="https://stackoverflow.com/questions/3316762/what-is-deserialize-and-serialize-in-json" target="_blank" rel="noopener">https://stackoverflow.com/questions/3316762/what-is-deserialize-and-serialize-in-json</a></li>
<li><a href="https://en.wikipedia.org/wiki/Serialization" target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Serialization</a></li>
<li><a href="https://github.com/igorbarinov/awesome-data-engineering?tab=readme-ov-file#serialization-format" target="_blank" rel="noopener">https://github.com/igorbarinov/awesome-data-engineering?tab=readme-ov-file#serialization-format</a></li>
<li>Книга &#171;Основы инжинирии данных&#187;</li>
<li><a href="https://www.freecodecamp.org/news/what-is-serialization/" target="_blank" rel="noopener">https://www.freecodecamp.org/news/what-is-serialization/</a></li>
<li><a href="https://javarush.com/quests/lectures/ru.javarush.python.core.lecture.level12.lecture07" target="_blank" rel="noopener">https://javarush.com/quests/lectures/ru.javarush.python.core.lecture.level12.lecture07</a></li>
<li><a href="https://habr.com/ru/articles/60317/" target="_blank" rel="noopener">Habr &#8212; Сериализация в Java</a></li>
<li><a href="https://habr.com/ru/articles/431524/" target="_blank" rel="noopener">Сериализация в Java. Не все так просто</a></li>
<li><a href="https://spark-school.ru/blog/spark-serialization/" target="_blank" rel="noopener">Как происходит сериализация данных в Spark</a></li>
<li><a href="https://bigdataschool.ru/blog/news/airflow/serialization-in-airflow.html" target="_blank" rel="noopener">Сериализация в Apache AirFlow</a></li>
<li><a href="https://github.com/tekumara/notes/blob/main/spark-serialization.md" target="_blank" rel="noopener">Spark Serialization</a></li>
</ul>
<p>Сообщение <a href="https://datatalks.ru/data-serialization-and-deserialization/">Процессы сериализации и десериализации данных. Форматы сериализации</a> появились сначала на <a href="https://datatalks.ru">DataTalks.RU. Data Engineering / DWH / Data Pipeline</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datatalks.ru/data-serialization-and-deserialization/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
