aws の s3 上にcsvファイルをgz圧縮して保存し aws の athena を利用してBIソフトでデータを参照するしくみで利用していましたが、BIソフトから扱うデータの量が増えていくたび処理が遅くなるのでいろいろと調べていたら列指向のデータ形式であるApache Parquet形式にすると処理能力が上がることがaws上のドキュメントに書かれてあります。
早速、parquet形式を使おうと思いましたが、Parquet形式への変換はGlue を使う、「CREATE TABLE AS クエリを使う」が書かれていました。
Glueは、社内で利用できないので諦めるしかなくまた、CREATE TABLE AS クエリで行うといったんCSVをs3に保存し、テーブルを作成しそのテーブルから新たにParquet形式のテーブルを作成することになるようで、そうすると、定期的にCSVファイルが更新されるたびにCREATE TABLE AS クエリを行う必要があるのでは?
それならば、csvファイルをローカル上からs3に送る前にwindows上のバッチ処理でファイルを少し整形してからaws cli を利用していたので、いっそのことParquet形式にしてからs3に置いたほうがやりやすいな。と思った次第です。
ですが、バッチ処理でcsvファイルをPaequet形式へ変換しようとするとPython とPyarrowを利用した変換方法を提供しているサイトはあったのですがバッチ処理内で利用するには面倒で何か良い方法はないかと調べていたら・・・
GitHubで、csv2parquet という 実行ファイルをRustで作っている方がみえました。これならバッチファイル内でも使用できると思い少しテスト
してみたので備忘録を記録しておきます。
サイトは、こちらです。https://github.com/domoritz/csv2parquet 利用におきましては、サイト先の内容をよく読んで自己責任でお願いします。※進化してhttps://github.com/domoritz/arrow-tools こちらにまとめられているようです。
csv2parquet は、windows でも利用できるバイナリが置いてありますのでそれをダウロードします。
https://github.com/domoritz/arrow-tools/releases
私は、csv2parquet-x86_64-pc-windows-msvc.zip を利用しました。
解凍してバッチファイルで使用できるようにパスが通ている場所に保存します。
私は、バッチファイルと同じ場所に保存してテストしました。
使い方
csv2parquet [option] <csv file> <parquet file>
[option]
オプションでは、いくつか設定できるのですがここでは、使用したもののみ抜粋しておきます
--compression 圧縮を設定できます。
圧縮形式には、以下が選べるようです
uncompressed, snappy, gzip, lzo, brotli, lz4, zstd
uncompressed :無圧縮です。
私はgzipを利用しました。
理由は、aws athena では、parquet の 標準圧縮形式でgzipをサポートしているとのことだったからです。
コマンドラインから利用するには、コマンドプロンプトを以下の記述で実行できます。
csv2parquet. --compression "gzip" "file.csv" "file.parquet"
parquet 形式に無事変換できたかを確認するには、parquetviewerというのがGitHub上にありましたのでそちらを利用しました。
サイトは、こちらです。https://github.com/mukunku/ParquetViewer こちらも利用におきましては、サイト先の内容をよく読んで自己責任でお願いします。
わたしは、ParquetViewer.exe を利用しました。
parquet形式に変換されたファイルを実行ファイル「parquetviewer」上にドラッグすると下のように表示されました。
ちなみに今回私がテストしたファイルは、
csvファイルでは、223kB
csv2parquet のオプション[--compression "gzip" ]で圧縮した場合 、6kB
でした。ちなみに無圧縮を指定した場合、507kB
でした。
実は、csv2partquet 上でgzip 圧縮指定をしてできたファイルなので 7z で解凍できると思い 7zにかけてみると 「データのペイロード後にデータが存在します」というコメントと共に解凍ができません。
いろいろ試してみたのですが、Parquetviewerでは、無圧縮でも、gzip圧縮したものでも同じように表示できます。
前途記載した通りファイルサイズも小さくなっているので圧縮もされていると思いますが、7zでは、解凍できません。
他の解凍アプリでも同じようにエラーとなります。
どうもParquet形式のなかで圧縮をサポートしているようであくまでもParquet形式のファイルのようです。
どういうことかというとParquet形式のデータへ変換した後にgzip圧縮をかけているのではなく、gzip圧縮されたデータをParquetの中で持っているという状態のようなのです。
それについては、Apache parquetのサイトのドキュメント上にもそのような感じのことが書かれていました。
それでは、athena上で言っているcsv形式、Parquet形式のファイルは、gzip圧縮をサポートしていると書いているのは、どの状態の圧縮のことを言っているのでしょうか。
1.無圧縮でのparquet形式にしたデータをgzip圧縮したファイル
2.parquet形式内でgzip圧縮されたデータを持つparquet形式のファイル
たぶん文章からすると1のような気がします。理由はcsv形式ではそもそもデータ内をgzip形式で持つという概念ではないからです。
まずは、ここまでテストしました。
次は、Athana上でのテストをしてみます。