BI Consult Desktop Logo BI Consult Mobile Logo
  • Russian BI Исследование российских bi
  • Перейти на Fine BI
  • Контакты
  • +7 812 334-08-01
    +7 499 608-13-06
  • Отправить сообщение
  • Главная
  • Продукты Эксперт-BI
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Сельское хозяйство
    • Энергетика
    • FMCG
    • Девелоперы
    • Маркетплейсы
    • Пищевая промышленность
    • Фармацевтика
    • Построение Data Platform
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и FP&A
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • IBP
    • ИТ (CIO)
    • Закупки
  • Платформы
    • Системы бизнес-анализа (BI)
    • Интегрированное бизнес-планирование (IBP)
    • Хранилища данных (DWH / Lakehouse)
    • Каталоги данных (Data Catalog)
    • Системы ETL и ELT
    • AI / Исскуственный интеллект
    • Шина данных (ESB)
    • Система управления мастер-данными (MDM)
    • Семантический слой
  • Услуги
    • Переход на отечественные BI и DWH системы
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений и DWH
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Курсы
    • Учебный курс Информационная грамотность (Data Literacy)
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Greenplum
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt (Data Build Tool)
  • Компания
    • Руководство
    • Новости
    • Клиенты
    • Карьера
    • Скачать
    • Контакты

BI

  • FineBI
  • FineReport
  • FineDataLink
  • FineChatBI (FineAI)
  • Коннекторы данных из 1С в BI
  • Airflow / Nifi
  • Visiology
  • PIX BI
  • Modus BI
  • Yandex.DataLens
  • Open-source BI: Superset/Metabase
  • Luxms BI
  • AW BI + Alpha BI
  • FlyBI + Форсайт. Аналитическая Платформа
  • Loginom
  • Триафлай
  • AI / Исскуственный интеллект
  • Optimacros
  • Навигатор BI
  • Семантический слой

СУБД

  • Arenadata
  • ClickHouse
  • Greenplum
  • Postgres Professional
  • TData

Другое

  • Построение Data Platform
    • Аналитическое хранилище данных
    • Data Lake и Data Engineering
    • Подробнее про Data Lake
    • Внедрение Lakehouse
      • Apache Doris
      • StarRocks
      • Trino
    • Миграция витрин из пропиетарных DWH на новый стек
    • Учебный курс "Современная архитектура хранилища данных"
Главная » Курсы по системам бизнес-анализа и методологии » Учебный курс Современная архитектура хранилища данных » Как генерировать файлы Parquet на Java

Как генерировать файлы Parquet на Java

Parquet - это формат файлов с открытым исходным кодом, разработанный компанией Apache для инфраструктуры Hadoop. Изначально  он создавался как формат файлов исключительно для Hadoop, но со временем стал очень популярным, и даже поставщики облачных услуг, такие как AWS, начали его поддерживать. В этом посте мы рассмотрим, что именно представляет собой формат файлов Parquet, а затем разберем простой пример создания или записи файлов Parquet на Java.

 

Введение  в формат файлов Parquet

При традиционном подходе мы храним данные в виде строк. Но Parquet использует другой подход: он «сплющивает» данные в столбцы перед их сохранением. Это повышает производительность запросов в разы. Кроме того, благодаря такому подходу к хранению данных формат может работать с наборами данных с большим количеством столбцов.

Большинство проектов по работе с Big Data используют формат файлов Parquet именно из-за всех этих особенностей. Файлы Parquet также позволяют сократить объем требуемого пространства для хранения данных. В большинстве случаев мы используем запросы с определенными столбцами. Прелесть формата заключается в том, что данные для столбца расположены рядом, поэтому запросы выполняются быстрее.

Благодаря оптимизации и популярности формата файлов даже Amazon предоставляет встроенные функции для преобразования входящих потоков данных в файлы Parquet перед сохранением в S3 (который выступает в роли озера данных). Я использовал эту опцию в  Athena и некоторых сервисах Apache. Для получения дополнительной информации о файловой системе Parquet рекомендую обратиться к официальной документации.

 

Зависимости

Прежде чем мы начнем писать код, нам нужно позаботиться о зависимостях. Поскольку это проект Spring Boot Maven, мы перечислим все наши зависимости в файле pom.xml:

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.apache.parquet</groupId> <artifactId>parquet-hadoop</artifactId> <version>1.8.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-core</artifactId> <version>1.2.1</version> </dependency> </dependencies>

 

Как Вы видите, мы добавляем стартовый пакет Spring Boot и еще несколько зависимостей Apache. Для данного примера это все, что нам нужно.

 

 

Характеристики

У нас есть файл application.properties, в котором мы указываем все свойства. Для нашего примера нам нужно всего два свойства: одно указывает путь к файлу схемы, а другое - путь к каталогу. Подробнее о схеме мы поговорим чуть позже. Итак, файл свойств выглядит следующим образом:

schema.filePath=
output.directoryPath=

 

Поскольку это приложение Spring Boot, мы будем использовать аннотацию @Value для чтения этих значений в коде:

@Value("${schema.filePath}")
 private String schemaFilePath; @Value("${output.directoryPath}") private String outputDirectoryPath;

 

Схема файла Parquet

Нам необходимо указать схему данных, которые мы собираемся записать в файл Parquet. Это необходимо потому, что при создании двоичного файла Parquet тип данных каждого столбца также сохраняется. Основываясь на схеме, которую мы указываем в файле схемы, код будет соответствующим образом форматировать данные перед записью в файл Parquet.

Я придерживаюсь простой схемы:

message m {
      required INT64 id;
      required binary username;
      required boolean active;  
}

 

Позвольте мне объяснить, что это такое. Первый параметр имеет тип INT64, то есть целое число, и называется id. Второе поле имеет тип binary, то есть является ничем иным, как строкой. Мы называем это поле именем пользователя. Третье поле - булево поле под названием active. Это довольно простой пример. Но, к сожалению, если ваши данные содержат сотню столбцов, Вам придется объявить их все здесь.

Ключевое слово required перед объявлением поля используется для проверки, чтобы убедиться в том, что для этого поля значение указано верно. Это необязательно, Вы можете убрать его для полей, которые не являются обязательными.

 

ParquetWriter

Время заявления об отказе от ответственности: я не писал эти два класса, о которых мы поговорим в этом разделе. Несколько месяцев назад, когда я изучал этот вопрос, я нашел их на StackOverFlow. Я не знаю, кто их написал. Но да, я переименовал их в соответствии с проектом.

Класс CustomParquetWriter расширяет класс ParquetWriter, который предоставляет Apache. Код для этого класса выглядит следующим образом:

public class CustomParquetWriter extends ParquetWriter<List<String>> { public CustomParquetWriter( Path file, MessageType schema, boolean enableDictionary, CompressionCodecName codecName ) throws IOException { super(file, new CustomWriteSupport(schema), codecName, DEFAULT_BLOCK_SIZE, DEFAULT_PAGE_SIZE, enableDictionary, false); } }
 

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

По сути, данный класс проверяет схему для того, чтобы определить тип данных каждого поля. После этогоданные записываются в файл, используя экземпляр класса RecordConsumer. Я не буду много говорить об этих двух классах, потому что а) я их не писал и б) код достаточно прост.

 

Подготовка данных для файла Parquet

Давайте подготовим данные для записи в файлы Parquet. Список строк представляет собой один набор данных для файла Parquet. Каждый элемент в этом списке будет значением корректирующего поля в файле схемы.

Глядя на файл схемы, мы можем сказать, что первое значение в массиве - это ID, второе - имя, а третье - булевский флаг для активного поля.

Итак, в нашем коде у нас будет список из списка String для представления нескольких строк. Да, Вы все правильно поняли, это список строк:

List<List<String>> columns = getDataForFile();

 

Давайте посмотрим на функцию, чтобы увидеть, как мы генерируем данные:\

private List<List<String>> getDataForFile() { List<List<String>> data = new ArrayList<>(); List<String> parquetFileItem1 = new ArrayList<>(); parquetFileItem1.add("1"); parquetFileItem1.add("Name1"); parquetFileItem1.add("true"); List<String> parquetFileItem2 = new ArrayList<>(); parquetFileItem2.add("2"); parquetFileItem2.add("Name2"); parquetFileItem2.add("false"); data.add(parquetFileItem1); data.add(parquetFileItem2); return data; }
 

Просто, не так ли? Идем дальше.

 

Получение файла схемы

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

MessageType schema = getSchemaForParquetFile(); ... private MessageType getSchemaForParquetFile() throws IOException { File resource = new File(schemaFilePath); String rawSchema = new String(Files.readAllBytes(resource.toPath())); return MessageTypeParser.parseMessageType(rawSchema); }
 

Как видите, мы читаем файл как строку, а затем разбираем ее с помощью метода parseMessageType() в классе MessageTypeParser, предоставляемом библиотекой Apache.

 

Получение Parquet Writer

Это предпоследний шаг в процессе. Нам просто нужно получить экземпляр класса CustomParquetWriter, о котором мы говорили ранее. Здесь мы также указываем путь к выходному файлу, в который будет производиться запись. Код для этого также довольно прост:

CustomParquetWriter writer = getParquetWriter(schema);

...

private CustomParquetWriter getParquetWriter(MessageType schema) throws IOException {
    String outputFilePath = outputDirectoryPath+ "/" + System.currentTimeMillis() + ".parquet";
    File outputParquetFile = new File(outputFilePath);
    Path path = new Path(outputParquetFile.toURI().toString());
    return new CustomParquetWriter(
            path, schema, false, CompressionCodecName.SNAPPY
    );
}
Запись данных в файл Parquet

Последний шаг  - нам осталось записать данные в файл. Мы создадим список и внесем его в файл с помощью Writer, который мы создали на предыдущем шаге:

for (List<String> column : columns) {
     writer.write(column); } logger.info("Finished writing Parquet file."); writer.close();

 

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

 

Узнать стоимость решенияЗапросить видео презентацию

← Предыдущая статья
Использование плагинов для загрузки файлов Parquet из S3 в Pinot
Следующая статья →
Конвертирование файлов Ethereum ETL в формат Parquet
Запросить видео презентацию Запросить доступ к демо стенду online Узнать стоимость лицензий

Задать вопрос

loading...

Решения

Анализировать ФинансыУвеличивайте ПродажиОптимальный Склад и ЛогистикаМаркетинговые Метрики

Клиенты
  • ПАО «Ростелеком» — российский провайдер цифровых услуг и сервисов. Предоставляет услуги широкополосного доступа в Интернет, интерактивного телевидения, сотовой связи, местной и дальней телефонной связи и др. Занимает лидирующие позиции на российском рынке высокоскоростного доступа в интернет, платного ТВ, хранения и обработки данных, а также кибербезопасности

  • ЭГИС - международная фармацевтическая компания, основанная в 1907 году в Венгрии. Компания имеет представительства более чем в 60 странах мира, в том числе в России. Компания ЭГИС является одним из ведущих производителей дженерических лекарственных средств в Центральной и Восточной Европе. Её деятельность охватывает все звенья производственно-сбытовой фармацевтической цепочки.

  • Авиакомпания NordStar (АО «АК «НордСтар») – работает под данным брендом с 2008 г. и сейчас входит в топ-15 крупнейших российских авиакомпаний (данные Росавиации) с пассажирооборотом более 1 млн человек в год. АО «АК «НордСтар» выполняет и внутренние, и внешние рейсы, а ее основные хабы - Домодедово, Пулково и Емельяново. С 2021 года компания является базовым перевозчиком аэропорта Норильск.

  • Группа компаний «Невский кондитер» основана в 1996 году в Санкт-Петербурге и на сегодняшний день является одним из крупнейших производителей кондитерских изделий в России.

     

  • Решения
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Энергетика
    • Фармацевтика
  • Услуги
    • Переход на отечественные BI и DWH
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Техническая поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Платформы
    • FineBI
    • FineReport
    • FineDataLink
    • Коннекторы данных из 1С в BI
    • Airflow + NiFi
    • Visiology
    • Luxms BI
    • Modus BI
    • PIX BI
    • Arenadata
    • ClickHouse
    • Greenplum
    • Postgres Professional
    • Open-source BI: Superset/Metabase
    • Loginom
    • Yandex.DataLens
    • AI / Исскуственный интеллект
    • Optimacros
    • Шины данных
  • Курсы
    • Учебный курс Информационная грамотность
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt
  • Функциональные решения
    • Создание Data Lake
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и прогнозная аналитика
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • Сквозная аналитика
  • Компания
    • О нас
    • Руководство
    • Новости
    • Клиенты
    • Скачать
    • Контакты
    • Политика конфиденциальности
RutubeVkontakteLinkedInYouTube
ООО "Би Ай Консалт",
ИНН: 7811437757,
ОГРН: 1097847154184
199178, Россия,
Санкт-Петербург,
6-ая линия В.О., Д. 63, 4 этаж
Тел: +7 (812) 334-08-01
Тел: +7 (499) 608-13-06
E-mail: info@biconsult.ru

 

 

 

 

 

×

Пользуясь сайтом, вы соглашаетесь с использованием cookies и политикой конфиденциальности.