MySQLのデータをApache Arrow形式で取り出す

これは、MySQL Advent Calendar 2022 の2日目のエントリです。

きっかけ

 最近、MySQL上のデータを Apache Arrow形式で取り出したいという機会を得ました。珍しいケースかもしれませんが、世の中にあまり情報も多くないようなので、ここに記録をしたためる次第。

環境・前提条件

 今回は以下の環境で動作確認をしました。

mysql2arrow のビルド

 mysql2arrow は、PG-Stromのリポジトリに含まれているものを自分でビルドして使います。

1. ビルド環境の整備

 だいたいこの辺のものを使います

$ sudo apt install gcc make build-essential libtool libssl-dev -y
2. PG-Stromソースコードの取得

 GitHubで公開されているので、cloneしてきます。

$ git clone https://github.com/heterodb/pg-strom
3. mysql2arrowのビルド

 今回は mysql2arrow が欲しいだけなので、PG-Strom全体をビルドせずに、ピンポイントで make します。MySQLがインストールされていない場合は mysql2arrowはビルドできません。

$ cd  pg-strom/arrow-tools
$ make mysql2arrow
4. arrow2csvのビルド

 今回は特に必要ないのですが、arrowファイルの中身をcsvファイルとして取り出せる arrow2csv というのもリポジトリに含まれているので、ついでにビルドしておくと便利

$ make arrow2csv

※ その他、例えば pg2arrow を make したい場合は PostgreSQLがインストールされている必要あり

mysql2arrow実行環境の整備

 mysql2arrowでは、日付時刻データの取り出し時にMySQL内部にあるタイムゾーン文字列の情報を使用します("UTC"とか"JST"など)。この情報は mysql.time_zone_name テーブルにあるのですが、デフォルトではこのテーブルにデータは含まれていないため、ここで手動で追加します(インストール方法に依るのかもしれません)。
 テーブルにデータが登録されているかを確認するには、以下のクエリが良いでしょう。

select * FROM mysql.time_zone_name;

 登録されていない場合、コマンドラインから mysql_tzinfo_to_sql コマンドを使用して登録します。

$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot -pMyPa5$w0Rd mysql

 いくつかエラーが出るけど、ぱっと見、魅力のなさそうな(主観)ファイルなので、今回は無視しておく。

mysql: [Warning] Using a password on the command line interface can be insecure.
Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.

mysql2arrow の実行方法

 テーブルを指定して、テーブルまるごとを Arrowファイルに吐き出させる方法と、クエリを指定して、クエリの実行結果をArrowファイルに吐かせる方法の2種類があります。

テーブルまるごとを吐かせる方法

 -t オプションでテーブル名を指定する。パスワード指定は、小文字5文字mysqlコマンドの場合は小文字のpだが、mysql2arrowでは大文字のPであることに注意。
 -d はデータベース名
 -o は出力先ファイル名

./mysql2arrow -uroot -PMyPa5$w0Rd -dtest -tmytable01 -oout.arrow
クエリを指定して吐かせる方法

 テーブル指定の場合は -t だったが、クエリを指定したい場合は代わって -c を使用する。

./mysql2arrow -uroot -PMyPa5$w0Rd -dtest -c"SELECT id, name, count(*) FROM mytable01 WHERE xxxx GROUP BY id, name;"  -oout.arrow

 どちらの方法も、あっさりと Arrowファイルに出力される。

余談: Arrowファイルの中身

 出力された Arrowファイルの中身を覗いてみます。Arrowファイルはいわゆるカラム型のストアなので、Nameカラムの中身(name001 name002....)が連続してかたまっていたり、ZipCodeカラムの中身(123-4567 234-567...)がかたまっていたりすることがわかります。面白い。