Apache DrillでRDBにアクセスしてみる

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;