Parquet形式で大量データの保存容量と処理時間が節約！

# はじめに
FileStorageソースとデスティネーションは、Xplentyでよく使われているコンポーネントです。
特に多彩なレコード形式を支援しており、異なるシステム間のデータ連携には欠かせない存在でもあります。

2024年の初めからParquet形式の書き込みのみんらず、読み込みも出来るようになりました。
今回の記事では、XplentyでParquetによる読み書きの設定をどう行うかを紹介したいと思います。

# Parquet形式の長所と短所
既に多くのお客様はご存知だと思いますが、ここでParquet形式について少しおさらいしましょう。
Parquet形式の正式名称はApache Parquetと言い、大量のデータを効率よく保存しつつ、比較的に読み取り性能を提供する目的で開発されたデータ保存形式です。

主な長所は下記の通りですが、要するに大量データを扱いやすいので分析業務に向いていることとディスク容量を減らす圧縮仕様にも関わらず読み込みの速さが取り上げられます。

|長所|説明|
|--|--|
|カラム指向のデータ形式による大量データ処理向け|Parquetはカラム指向形式でデータを格納するため、クエリで必要なカラムのみを読み取ることができます。これにより、データ量が多い場合でもパフォーマンスが向上します。|
|効率的な圧縮でディスク使用量がかなり節約|Parquetはデータを圧縮して格納するため、ディスク使用量を削減します。特に、数値データや繰り返しが多いデータに対して高い圧縮率を発揮します。|
|高速なクエリ処理|データがカラムごとに格納されているため、特定のカラムにアクセスするクエリは非常に高速です。例えば、分析用クエリで特定のフィールドにだけアクセスする場合、行全体を読み込む必要がないため処理が効率化されます。|
|スキーマがある為、データ共有が楽|Parquetはスキーマ（データ構造）をサポートしているため、データの読み込み時にスキーマの整合性をチェックできます。これにより、異なるアプリケーション間でのデータ共有が容易になります。|
|大量データを扱う分析向け|大規模データセットを効率的に扱うため、Hadoop、Spark、Hiveなどの分析ツールと相性が良く、大量のデータを取り扱うビッグデータ処理に適しています。|

しかし、世の中の全てには長所と短所があるように、Parquet形式は下記の短所もあります。

|短所|説明|
|--|--|
|小さなデータセットの場合、別のデータ形式がより効率的|Parquetは大規模なデータセットでのパフォーマンスに最適化されているため、小規模なデータやリアルタイム処理には向きません。小さなデータセットではJSONやCSVなど、行指向の形式の方が効率的な場合があります。|
|書き込みコストが高いため、更新頻度が高い作業には不向き|Parquetは圧縮やカラムごとのデータ格納のため、書き込み時のオーバーヘッドが比較的高くなります。特にデータの追加や更新頻度が高い場合には、パフォーマンスが低下する可能性があります。|
|スキーマの柔軟性が低いので、スキーマ変更は要注意|Parquetは厳密なスキーマを持つため、頻繁にスキーマが変わるデータには適していません。スキーマ変更が必要な場合、データ全体を再度書き込みする必要があることがあります。|
|サポートされるエコシステムの制約|Parquetはビッグデータ処理用のツール（Hadoop、Sparkなど）と非常に相性が良いですが、小規模データ処理や一般的なアプリケーションには十分に対応していない場合があります。|

このようにParquet形式で保存されたデータは、大規模データの効率的なクエリ処理や圧縮に非常に適しており、特にビッグデータや分析用途で高い性能を発揮します。この点でParquet形式は大量データの転送を専門にするXplentyとも相性が良い形式だと言えます。

# XplentyでParquet形式への書き込み
Parquet形式への書き込み機能は以前から提供しており、後に説明するデモ用のパッケージは大量のCSVファイルをXplentyにてParquet形式に書き込んでみます。

### 1. 大量CSVデータの準備
Parquet形式を試すためには大量のデータが必要です。今回はアメリカの[citibike社の運行データ](https://s3.amazonaws.com/tripdata/index.html)を使います。１年間の運行データだと圧縮しても簡単に１ギガを超えていますので、parquet形式のテストには適しており、誰もが使えるように公開されています。

その中に選んだのは[2020年度のcitibike-運行データ](https://s3.amazonaws.com/tripdata/2020-citibike-tripdata.zip)で、zipで固めた容量が751.2メガの１本の圧縮ファイルです。一見、少なめの容量に見えますが解凍するとなんと合計3.61ギガの27本の巨大CSVファイル群になります。zipの圧縮率を換算するとおよそ**21%の圧縮率**です。
この書き込みデモではParquet形式の書き込みは、プレーンテキストのCSVに対しどれぐらいの圧縮効率を見せるかを見てみましょう。

まず、冒頭に紹介したリンクから運行データをダウンロードし、ローカルで解凍します。解凍したcsvファイル群を図のようにS3やFTPサーバにおいておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/fe376419-95ad-046c-e057-cd7b616bd6e1.png)

ここからデモ用のパッケージの作成になりますが３つのコンポーネントを使って、大量のCSVファイルを読み込んで、３つのフィールドを追加しでからParquet形式に保存します。

### 2. CSVファイルの読み込み

Xplentyのパッケージ編集画面でFileStorage sourceを置き、詳細設定を下記のとおりにし、すべてのフィールドを選択すると下記の図のようにData Previewでデータの読み込みが確認出来ます。

|項目名|設定値|
|--|--|
|Connector|S3|
|Bucket|該当コネクターのバケット名|
|Path|`/2022-citibike-tridata/*.csv`|
|Record delimiter|`New Line`|
|Record type|`Delimiter values`（CSVファイルを意味)|
|Delimiter|`,`|
|String qualifier|`"`|
|Escape character|`\`|
|First row contains field names|`Checked`|
|Source action|`Process all files from source`|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/2cfce366-f8ee-1c36-8b36-fd1ef9d8fc65.png)

### 3. 三つの取り込み日時の追加
既存のデータに追加で３つのタイムゾーン（UTC,JST,KST）のデータ取り込み日時のフィールドを追加します。
まず、パッケージ編集画面上でSelectコンポーネントを追加して**Auto-fill**ボタンでソースからフィールドをすべて追加しておきます。

次に、一番最後のフィールドに行き、右側の`+`をクリックすると新規フィールドが追加されますので、下記の表に基づいてAliasとExpressionをそのまま記入してください。確認のため、下記の図のように**Previewボタン**にてデータを確認します。

|Expression|Alias|
|--|--|
|`ToString(CurrentTime(), 'yyyy-MM-dd HH:mm:ss')`|imported_at_utc|
|`ToString(SwitchTimeZone(CurrentTime(), 'Asia/Seoul'), 'yyyy-MM-dd HH:mm:ss')`|imported_at_kst|
|`ToString(SwitchTimeZone(CurrentTime(), 'Asia/Tokyo'), 'yyyy-MM-dd HH:mm:ss')`|imported_at_jst|

![filestorage-part03-ko_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/6f9cdbec-c6b4-ce2d-2402-31d2f21d6072.jpeg)

### 4. Parquet形式で書き込み
取り込み日時のフィールドを追加した後、ソートコンポーネントにてstarted_atフィールドの昇順にソートします。
最後にFileStorage destinationをつなぎ、詳細設定を下記の通りにするとパッケージは完了です。

|項目名|設定値|
|--|--|
|Connector|S3|
|Target bucket|該当コネクターのバケット名|
|Target directory|`parquet-output`|
|Destination format|`parquet`|
|Merge output to single file|`Checked`|
|Target file names|`Custom pattern`|
|File name prefix|`2020-citibike-tripdata.`|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/57ded358-b642-c8fe-1e78-aacea192770d.png)

### 5. パッケージの実行と結果確認
パッケージを実行するとソートが掛けられた場合は18分弱で、ソート無しの場合は、7分になります。下記の図はソートを行った場合の結果を見せています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/1c753532-e90a-d025-6ee6-323aa5a2650c.png)

肝心のデータ容量の確認ですが、1.66ギガです。
parquetは読み込みの速さを保証するため、Gzipのような圧縮ソフトn比べて低い**46%の圧縮率**になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/8f349596-60c3-125d-0051-792868da685a.png)

しかし、圧縮して1.66ギガの大きさにも関わらず、解凍の気配が全く感じないような、驚異的な速さでエディタから読み込みができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/b0e40cb8-7993-49f0-a605-08371c590434.png)

# 終わりに
プレーンテキストのCSVやJSON形式の大量データでは保存容量の問題によるストレージ費用の増加するし、データの圧縮でストレージの費用を抑えても必要な時は解凍に時間が掛かってしまうので利便性の問題が発生します。
parquet形式は、読み込みの速さと保存領域の節約という２つ利便性を一気に解決したもので、まさに大量データの扱いにピッタリのデータ形式です。

大量データの転送と便利なparquet形式を使ったデータパイプラインの作成にXplentyはまさに最適です。
ぜひ２週間の[無料トライアル](https://www.integrate.io/jp/free-trial/)で、御社の大量データの容量圧縮と費用節約がどれぐらいになるかお試しは如何でしょうか？