🙌

PHPによるParquetデータの作成

2023/09/28に公開

PHPでParquetデータを作成する方法

はじめに

初めまして。アイディオットDX開発部の宮中です。

PHPでParquetデータを作成する方法の日本語の記事が少ないので、記録したいと思います。

Parquetとは

ParquetとはCSVのような行志向のフォーマットと違い、列志向のフォーマットです。

主にビッグデータ処理フレームワークやデータウェアハウスなど、大規模なデータセットを扱うために設計されています。

Amazon Web Services (AWS) のデータ分析およびクエリサービスであるAmazon Athenaで保存することにより、効率的で高速なクエリが可能になります。

ファイルを圧縮し、さらに Apache Parquet などの列形式に変換した場合、サイズは 3 分の 1 に圧縮され、S3 でのデータは最終的に 1 TB になります。
ただしこの場合、Parquet は列形式なので、Athena で読み取る必要があるのは、実行されているクエリに関連する列のみです。
当該のクエリは 1 つの列のみを参照するものであるため、Athena ではその列のみが読み取られ、ファイルの 4 分の 3 は読み取らなくてよいことになります。
Athena で読み取られるのはファイルの 4 分の 1 のみであるため、S3 からスキャンされるデータは 0.25 TB のみになります。

今回の記事の参考サイト

前提

  • PHPの環境構築を行っていること
  • PHPで以下の機能を使えること

    bcmath

    gmp

    zlib

    snappy (https://github.com/kjdev/php-ext-snappy)
  • composerをインストールしていること

手順

1. パッケージをcomposer経由でインストールする

composer require codename/parquet

2. データカラムを作成する

Parquetは列志向のため、列ごとにデータをインサートする。

今回、インサートするデータは

id name
1 八村
2 渡邊
3 河村

です。

最近、バスケ日本代表が話題になったので、選手の名前をお借りします。

use codename\parquet\data\DataColumn;
use codename\parquet\data\DataField;

$idColumn = new DataColumn(
  DataField::createFromType('id', 'integer'),
  [ 1, 2, 3 ]
);

$nameColumn = new DataColumn(
  DataField::createFromType('name', 'string'),
  [ "八村", "渡邊", "河村" ]
);

3. スキーマを作成する

データカラムからスキーマを作成します。

use codename\parquet\data\Schema;

$schema = new Schema([$idColumn->getField(), $nameColumn->getField()]);

4. ファイルを作成して書き込む

詳細はコメントで記述します。

use codename\parquet\ParquetWriter;

// 書き込むファイルを用意
$fileStream = fopen(__DIR__.'/test.parquet', 'w+');

// ParquetWriterのインスタンスを作成。
$parquetWriter = new ParquetWriter($schema, $fileStream);

// 作成するファイルのメターデータを作成
$metadata = ['author'=>'トム・ホーバス', 'date'=>'2023-09-28'];
$parquetWriter->setCustomMetadata($metadata);

// 新しい列を作成
$groupWriter = $parquetWriter->CreateRowGroup();

// データ書き込み
$groupWriter->WriteColumn($idColumn);
$groupWriter->WriteColumn($nameColumn);

// 行の書き込み終了
$groupWriter->finish();

// Parquetの書き込み終了
$parquetWriter->finish();

コードまとめ

use codename\parquet\ParquetWriter;
use codename\parquet\data\Schema;
use codename\parquet\data\DataField;
use codename\parquet\data\DataColumn;

$idColumn = new DataColumn(
  DataField::createFromType('id', 'integer'),
  [ 1, 2, 3 ]
);

$nameColumn = new DataColumn(
  DataField::createFromType('name', 'string'),
  [ "八村", "渡邊", "河村" ]
);

$schema = new Schema([$idColumn->getField(), $nameColumn->getField()]);

$fileStream = fopen(__DIR__.'/test.parquet', 'w+');

$parquetWriter = new ParquetWriter($schema, $fileStream);

$metadata = ['author'=>'トム・ホーバス', 'date'=>'2023-09-28'];
$parquetWriter->setCustomMetadata($metadata);

$groupWriter = $parquetWriter->CreateRowGroup();

$groupWriter->WriteColumn($idColumn);
$groupWriter->WriteColumn($nameColumn);

$groupWriter->finish();

$parquetWriter->finish();

まとめ

多言語だとParquetを作成する日本語記事はあるのですが、PHPだと少ないので、今回まとめて見ました。

Parquetファイルをストレージに保存することで、検索が高速になり、コストも安くなるので、ぜひ導入してはいかがでしょうか?

大量データを扱うPHPエンジニアにとって参考になったら嬉しいです。

あとがき

AI・データ利活用をリードし、世界にインパクトを与えるプロダクトを開発しませんか?

アイディオットでは、今後の事業拡大及びプロダクト開発を担っていただけるエンジニアチームの強化を行っております。

さらに会社の成長を加速させるため、フロントエンドエンジニア、バックエンドエンジニア、インフラエンジニアのメンバーを募集しております!

日本を代表する企業様へ自社プロダクトを活用した、新規事業コンサルティング、開発にご興味のある方はお気軽にご連絡ください。

【リクルートページ】

https://aidiot.jp/recruit/

【募集ポジション一覧】

https://open.talentio.com/r/1/c/aidiot/homes/3925

【採用についてのお問合せ先】

株式会社アイディオット 採用担当:大島

メールアドレス:recruit@aidiot.jp

Discussion