Parquet形式での大量データの読み込み

# はじめに

以前はXplentyでのparquet形式は書き込みのみを支援しました。しかし、2024年の3月からparquet形式の読み込みの支援し始めました。

[以前の記事](https://qiita.com/Integrateio/items/346f72b5c5fb064e527c)でも言及したようにparquet形式は大量データの扱いに特化しています。今回は、前回の記事で書き出しておいたparquest形式のデータを読み込んで他に連携するパッケージを紹介したいと思います。

# XplentyでParquet形式への書き込み
### 1. parquet形式のデータの準備
まずは、parquet形式のデータを保存するFileStorage sourceで使えるSftpサーバやオブジェクトストレージ(S3, Google Cloud Storage, Azure Blob Storage)をご用意ください。[大量データの書き込みはParquet形式で色々節約](https://qiita.com/Integrateio/items/346f72b5c5fb064e527c)の記事をご参照の上、大量データをparquet形式で保存しておいてください。

これで準備は完了です。

### 2. parquet形式のデータの読み込み
お馴染みのパッケージ編集画面に入り、FileStorage source・コンポーネントを選択してください。FileStorage sourceの詳細設定を下記を参照して入れるとparquet形式のファイルの読み込みが出来ます。

|項目名|設定値|
|--|--|
|Connector|S3|
|Bucket|該当コネクターのバケット名|
|Path|`/parquet-output/2020-citibike-tripdata.*.parquet`　※ 個人の設定に合わせて変えてください！|
|Record delimiter|`New Line`|
|Record type|`parquet`|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/27014b36-c1c2-a9ea-6b4f-ae11ee6596b5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/423f7081-b289-0613-4f91-a647a78529f9.png)

### 3. 追加のフィールドを設定
Selectコンポーネントを選択して、下記のようなフィールドを追加してください。
Auto-fillボタンでソースからフィールドをすべて追加しておき、最後のフィールドに行きます。右側の`+`をクリックすると新規フィールドが追加されるので、下記の表に基づいてExpressionとAliasをそのまま記入してください。

|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-part04-ko_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/aa55b698-7328-0a3b-d6b1-7f0c71448daf.jpeg)

### 4. データのJSON形式の書き出し
追加のフィールドの設定後にJSON形式で書き出すためにFileStorage destinationをパッケージに追加します。
FileStorage destinationをSelectコンポーネントに繋ぎ、詳細設定を下記の表に従って行います。
これで、parquet形式を読み込んでそれをJSON形式に書き出すデータパイプラインの完成です。

|項目名|設定値|
|--|--|
|Connector|S3|
|Target bucket|該当コネクターのバケット名|
|Target directory|`json-output-test`|
|Destination format|`Line Delimited JSON`|
|Destination action|`Write all files directly and replace files in directory if they already exist`|
|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/303590cf-996e-f9ac-6381-d9ee27a699b1.png)


完成したパッケージを`Save and Validate`ボタンで保存し、クラスタで実行すると下記のように指定のファイル名で`json-output-test`ディレクトリにJSONファイルが保存されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/b86716c8-d6e8-48ca-5aa2-7c81267517ca.png)


### ※ 参考 - ファイルの読み込み時にtimeoutエラーになった場合の対応
FileStorage sourceでは、データの読み込み時に下記の図のようにtimeoutエラーになる場合があります。
ParquetやExcel形式のファイルは、スキーマ構造を解るためにファイルの展開が必要になります。ファイルにあるデータが少ない場合は問題ありませんが、データが多いと展開に想定よりも時間が掛かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/588841de-56f2-d7c7-9bd4-81497d0f1e76.png)

この場合の対応策としては、まずはPathにデータが少ないParquetやExcel形式のファイルを指定してFileStorage sourceやパッケージを構成し、保存、テストを一通りに完了させます。
FileStorage sourceを再び開き、`02 Source properties`にそのまま行ってPathを本番用のデータが多いファイル名に設定してからそのまま`Save`ボタンをクリックして保存します。

注意点は、`03 Select input fields`には行かないことです。誤っていった場合はそのまま`Cancel`ボタンで保存せずに設定画面から出て、再びFileStorage sourceを開き、`02 Source properties`で**Path**のファイル名を変更してください。

# 終わりに
Parquet形式は大量データを迅速に扱い、かつ保存領域の節約に非常に役立ちます。AWSのAthenaでも当ファイル形式を支援しているので様々な大量のデータをparquet形式で転送して分析業務に迅速に対応が可能です。

弊社integrate.ioは、無料で[２週間のトライアル](https://www.integrate.io/jp/demo/)を提供しております。ぜひ、お試し頂ければ幸いです。