Apache Drillはストレージプラグインで様々なデータソースに対応しているのですが、JDBC用のストレージプラグインも用意されており、これを使用するとDrillからRDBにアクセスすることができます。
もちろん、ただ単に検索するだけならわざわざDrill経由でやる必要はないのですが、これによってJSONファイルをRDBのテーブルとジョインしたり、複数のRDBのテーブルをジョインしたり、といったことが可能になります。
まずはJDBCドライバのjarファイルをDRILL_HOME/jars/3rdparty
にコピーし、DrillのWebコンソールから以下のような設定でストレージプラグインを追加します。
{ "type": "jdbc", "driver": "org.h2.Driver", "url": "jdbc:h2:~/.gitbucket/data", "username": "sa", "password": "sa", "enabled": true }
検索してみるとエラーになってしまいました。
0: jdbc:drill:zk=local> SELECT * FROM h2.ACCOUNT; Error: DATA_READ ERROR: The JDBC storage plugin failed while trying setup the SQL query. sql SELECT * FROM "DATA"."ACCOUNT" plugin h2 Fragment 0:0 [Error Id: c2405326-b1bb-4e7f-a57f-fc01a31b219f on 192.168.0.3:31010] (state=,code=0)
H2の場合だけかもしれませんが、データベース名とスキーマが同じでないとダメみたいです(データベース名とスキーマ名をあわせておいたら検索できました)。
また、異なるスキーマで同じテーブルがあるようなデータベースの場合もエラーになってしまいました。
Drillは既存のデータソースに対しあとから適用できるのが大きなメリットの1つですが、RDBの場合はデータベースの構成によって利用できないケースがあるのはちょっと残念なところです。
(追記)前者に関しては以下のようなSQLで正しく検索することができました。てっきりデータベース名がDrill上でスキーマ名として扱われているのかと思っていたのですが、H2がカタログ名としてデータベース名を返していただけのようです。完全に勘違いしていました…。
SELECT * FROM h2.DATA.PUBLIC.ACCOUNT;