Apache Spark用のスタンドアロンJDBCドライバ

SparkにJDBCでアクセスするにはThriftserverを入れたりHive Metastoreが必要だったりで色々面倒なのですが、単体で利用可能な方法はないのかなと思って探してみたところ、以下のものを見つけたので試してみました。

github.com

このJDBCドライバは以下のようなURLでJDBC経由でSparkSQLを使うことができます。

com.zensolution.jdbc.spark:/Users/foobar/temp/console?format=csv&csv.header=true&csv.delimiter=;

SQL内でアクセスされているテーブルはクエリの実行前にテンポラリビューとして自動的に登録されます。たとえば以下のようなSQLを実行したとします。

SELECT * FROM people

このJDBCドライバはまずクエリをパースし、このクエリの実行にpeopleテーブルが必要であることを認識します。そして/Users/foobar/temp/console/peopleディレクトリ配下に保存されているCSVファイルを参照するDataFrameを作成し、SparkSQLからアクセスできるようにテンポラリビューとして登録します。前述の通りこのプロセスはクエリの実行前に自動的に行われます。

このJDBCドライバには動作するのですが、2つの不満点がありました。1つはSparkのローカルモードでの実行しかサポートしていないこと、もう1つはJDBC URLで単一のデータソースしか指定できないことです。そこでこれらの不満点を改善すべく、フォークして変更を加えてみました。

github.com

まずはリポジトリをクローンしてJDBCドライバのjarファイルをビルドします。以下のコマンドでbuild/libs/spark-jdbc-all.jarが生成されるので、このファイルをクラスパスに追加します。

./gradlew clean shadowJar

次に以下のような設定ファイルを作成します。

{
  "tables": [
    {
      "name": "people",
      "path": "examples/src/main/resources/people.csv",
      "format": "csv",
      "options": {
        "header": "true",
        "inferSchema": "true",
        "delimiter": ";"
      }
    },
    {
      "name": "users",
      "path": "examples/src/main/resources/users.orc",
      "format": "orc"
    }
  ]
}

以下のようなURLで任意のスタンドアロンSparkクラスタ(もしくはローカルモード)へのJDBC接続が可能です。

実用的かどうかはさておき、一応動くものができたので個人的には満足ですw