これは、MySQL Advent Calendar 2022 の2日目のエントリです。
きっかけ
最近、MySQL上のデータを Apache Arrow形式で取り出したいという機会を得ました。珍しいケースかもしれませんが、世の中にあまり情報も多くないようなので、ここに記録をしたためる次第。
mysql2arrow のビルド
mysql2arrow は、PG-Stromのリポジトリに含まれているものを自分でビルドして使います。
1. ビルド環境の整備
だいたいこの辺のものを使います
$ sudo apt install gcc make build-essential libtool libssl-dev -y
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...)がかたまっていたりすることがわかります。面白い。