SparkにJDBCでアクセスするにはThriftserverを入れたりHive Metastoreが必要だったりで色々面倒なのですが、単体で利用可能な方法はないのかなと思って探してみたところ、以下のものを見つけたので試してみました。
この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で単一のデータソースしか指定できないことです。そこでこれらの不満点を改善すべく、フォークして変更を加えてみました。
まずはリポジトリをクローンして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接続が可能です。
ローカルモード
jdbc:spark:local?config=<path_to_file>
-
実用的かどうかはさておき、一応動くものができたので個人的には満足ですw