投稿者:佐々木


Google Cloudの2021/02/16のリリースノートにて、BigQuery(以下BQ)はParquet形式でのテーブルデータのエクスポートをサポートするようになったと発表がありました。
実は私ちょうど、BQのデータをParquet形式に変換するプログラムを作成しており、ほぼ完成間近のところでしたので、今回の発表は嬉しいというか、少し悔しいというか、複雑な気持ちでしたね。。
とにかく、便利な機能は利用するに越したことはないと前向き考えて、早速今回実装された機能を試してみましたので、使ってみた感想をお伝えしていきたいと思います。


1. Parquetとは

ParquetはHadoopの各種プロジェクトで利用可能オープンソースのファイルフォーマットです。
CSVのような行指向のフォーマットではなく、列指向のフォーマットとなっているため、読み込み時には、カラムを指定するなどしてより効率的なデータ処理の実現が可能です。
また、Parquetファイルはデータ圧縮されているので、CSVなどの形式よりもサイズが格段に小さいという特徴も持っています。
さらに、今回紹介するBQの他にもAWS AthenaやAmazon Redshift Spectrumでもサポートされているので、サービス間のデータ連携も容易に行うことができます。

詳しい内容はこちらのドキュメントをご覧ください。

2. 今回の実行手順

今回の検証はBQのテーブルデータをParquet形式でGoogle Cloud Storage(以下GCS)にエクスポートするというものになります。 検証の実行手順としては以下の4つとなります。
  1. GCPコンソールにアクセス
  2. Cloud Shellを開く
  3. プロジェクトが指定されていることを確認
  4. bqコマンドを実行

手順1, 2, 3に関しての説明は今回は省略させていただきます。 4のbqコマンドについてはその例を以下に載せておきます。[]部分のプロジェクトIDやテーブル名、エクスポート先については、適宜変更してください。
エクスポート機能についての公式のドキュメントはこちらになります。(こちらのドキュメントには2021/2/19現在Parquetの内容はまだ反映されていません)
bq --location=[location] extract \
--destination_format PARQUET \
--compression SNAPPY \
[project_id:dataset.table] \
gs://[bucket]/[file_name].parquet 


3. 実行してみて気づいたこと

今回の機能検証をしてみて、気づいたことが以下5点あるので挙げてみました。 それぞれについて説明していきたいと思います。
  • プレビューでの実装ということもあり、GUIでは機能がサポートされていない
  • 圧縮形式はSNAPPYのみ
  • テーブルデータが1GB以上の場合、ファイルは分割して出力される
  • RECORD型や配列型のデータは、Parquetファイルには1つのデータとして出力される
  • BQテーブル中にGEOGRAPHY型があるとエラー発生し、エクスポートできない
  • BQテーブルのデータ型と出力されたparquetファイルのデータ型について

プレビューでの実装ということもあり、GUIでは機能がサポートされていない

BQのコンソールでは2021/2/19現在はCSV, JSON, Avroの3種類しかサポートされていません。 そのため、今回の検証でもParquetのエクスポートはbqコマンドでの実行となりました。GUIでのサポートは今後のリリースに期待しましょう。

圧縮形式はSNAPPYのみ

JSONやCSVでのエクスポート時の圧縮形式はGZIPとなりますが、Parquetの場合はSNAPPYのみとなります。 SNAPPY以外の圧縮形式をご希望の方はお気を付けください。

テーブルデータが1GB以上の場合、ファイルは分割して出力される

こちらは他のファイル形式でのエクスポート時と同様ですが、テーブルデータが1GB以上の場合は、複数のファイルに分割されます。 そのため、出力先のURIを指定する際は、ワイルドカードURIを使用する必要があります。
詳しくはこちらをご覧ください。

RECORD型や配列型のデータは、Parquetファイルには1つのデータとして出力される

こちら少し分かりにくいかと思いますが、BQのプレビュー機能では上図のようにRECORD型カラムは1つのkeyにつき、1列表示されています。 また、配列型のカラムは1つの要素につき、1行表示されるようになっています。 これらのデータに関しては、Parquetファイルでは以下のように{}や[]付きでどちらも1行1列で表現されるようです。

record型出力例:{'key': 'abc', 'value': 'def'}
配列型出力例:['aaa', 'bbb']

BQテーブル中にGEOGRAPHY型があるとエラー発生し、エクスポートできない

Parquetが対応しているデータ型にはGEOGRAPHY型がないため、このような結果になってしまうようです。 Parquetエクスポートする際は対象のテーブルデータにGEOGRAPHY型がないか確認する必要があります。

BQテーブルのデータ型と出力されたParquetファイルのデータ型について

BQテーブルのデータ型と出力されたParquetファイルのデータ型の対応表は下図の通りです。
Parquetのデータ型ではBQのデータ型に対応できていないものもあるので、そのデータに関しては、変換処理が必要になるかもしれません。



4. まとめ

Parquetエクスポートしたい私にとっては、多少の制約はありますが、便利な機能だと思いました。 これでBQのエクスポート機能がサポートするファイル形式はCSV, JSON, Avro, Parquetの4種類となったので、 状況に合わせて使い分けていきたいと思います。