AWSのデータストアやフォーマットに依存しない問い合わせが可能に。オープンソースとして公開されたSQL互換クエリ言語「PartiQL」を触ってみた
先日、SQL互換の新しい問い合わせ言語およびそのリファレンス実装となる「PartiQL」がオープンソースとして公開されました。
Announcing PartiQL, one query language for your relational and non-relational data: https://t.co/ykrFrrOFEO pic.twitter.com/VN2FLJkvqN
— AWS Open Source (@AWSOpen) August 1, 2019
PartiQLの概要及び技術的な仕組みの詳細解説は下記エントリ群を参照頂くとして、
公式サイトにてPartiQLのチュートリアルが公開・展開されていますので、当エントリでは早速「PartiQLを触ってみた」内容について紹介してみたいと思います。
目次
前提条件
PartiQLの利用にはJava Runtime(JVM)が利用環境下に導入されている必要があります。(OpenJDK, OpenJDK for Windows, Oracle何れでも可)
任意のJava環境を導入し、java -versionで導入したバージョンが表示されていることを確認しておいてください。
$ java -version
実行環境のインストール
環境導入は至ってシンプル。ソースコード一式を入手、展開するだけです。ソースコードは以下GitHubから入手出来ます。
今回検証した環境はMac OSでしたので、tgzファイルをダウンロード&解凍。
$ mkdir PartiQL $ cd PartiQL/ $ wget https://github.com/partiql/partiql-lang-kotlin/releases/download/v0.1.0-alpha/partiql-cli-0.1.0.tgz $ tar cvf partiql-cli-0.1.0.tgz $ ls partiql-cli-0.1.0 partiql-cli-0.1.0.tgz
ファイル・フォルダ構成
導入した環境のファイル・フォルダ構成を確認してみます。
- bin配下には(Mac,Linux,Windows環境下での)partiql実行に必要な実行ファイルが含まれる。
- lib配下にはPartiQLの実行に必要なすべての必要なJavaライブラリが含まれる。
- Tutorial配下にはチュートリアル(PDF版/HTML版)が含まれる。また配下のcodeには以下3種類のファイルが含まれる。
- 拡張子.envのファイル:チュートリアルで使用する、クエリ可能なPartiQLデータ。
- 拡張子.sqlのファイル:チュートリアルで使用する、PartiQLクエリ。
- 拡張子.outputのファイル:サンプル照会出力ファイル。出力例を記載。
$ pwd /path/to/PartiQL/partiql-cli-0.1.0 $ tree . ├── README ├── Tutorial │ ├── code │ │ ├── q1.env │ │ ├── q1.output │ │ ├── q1.sql │ │ ├── q10.env │ │ ├── q10.output │ │ ├── q10.sql │ │ ├── q11.env │ │ ├── q11.output │ │ ├── q11.sql │ │ ├── q12.env │ │ ├── q12.output │ │ ├── q12.sql │ │ ├── q13.env │ │ ├── q13.output │ │ ├── q13.sql │ │ ├── q14.env │ │ ├── q14.output │ │ ├── q14.sql │ │ ├── q15.env │ │ ├── q15.output │ │ ├── q15.sql │ │ ├── q16.env │ │ ├── q16.output │ │ ├── q16.sql │ │ ├── q17.env │ │ ├── q17.output │ │ ├── q17.sql │ │ ├── q18.env │ │ ├── q18.output │ │ ├── q18.sql │ │ ├── q2.env │ │ ├── q2.output │ │ ├── q2.sql │ │ ├── q3.env │ │ ├── q3.output │ │ ├── q3.sql │ │ ├── q4.env │ │ ├── q4.output │ │ ├── q4.sql │ │ ├── q5.env │ │ ├── q5.output │ │ ├── q5.sql │ │ ├── q6.env │ │ ├── q6.output │ │ ├── q6.sql │ │ ├── q7.env │ │ ├── q7.output │ │ ├── q7.sql │ │ ├── q8.env │ │ ├── q8.out │ │ ├── q8.output │ │ ├── q8.sql │ │ ├── q9.env │ │ ├── q9.output │ │ ├── q9.sql │ │ └── tutorial-all-data.env │ ├── tutorial.html │ └── tutorial.pdf ├── bin │ ├── partiql │ └── partiql.bat └── lib ├── annotations-13.0.jar ├── cli-0.1.0.jar ├── ion-java-1.5.0.jar ├── jopt-simple-6.0-alpha-3.jar ├── kotlin-stdlib-1.3.40.jar ├── kotlin-stdlib-common-1.3.40.jar ├── kotlin-stdlib-jdk7-1.3.40.jar ├── kotlin-stdlib-jdk8-1.3.40.jar └── lang-0.1.0.jar 4 directories, 70 files
PartiQLの起動
binフォルダ配下のpartiqlを実行する事でPartiQL REPLが起動します。
$ cd ./partiql-cli-0.1.0 $ ./bin/partiql Welcome to the PartiQL REPL! PartiQL>
試しに以下の様なクエリを実行してみます。Enterキーを2回押下する事でクエリが実行されます。また、PartiQLの終了はControl+D(macOSまたはUnixの場合)、Control+C(Windowsの場合)で抜けられます。
PartiQL> SELECT * FROM [1,2,3] /** ここでEnterキー押下(1回目) */ | /** ここでEnterキー押下(2回目) */ ===' << { '_1': 1 }, { '_1': 2 }, { '_1': 3 } >> --- OK! (101 ms) PartiQL>
--helpでどういうオプション実行が可能かも確認してみます。
$ ./bin/partiql --help PartiQL CLI Command line interface for executing PartiQL queries. Can be run in an interactive (REPL) mode or non-interactive. Examples: To run in REPL mode simply execute the executable without any arguments: partiql In non-interactive mode we use Ion as the format for input data which is bound to a global variable named "input_data", in the example below /logs/log.ion is bound to "input_data": partiql --query="SELECT * FROM input_data" --input=/logs/log.ion The cli can output using PartiQL syntax or Ion using the --output-format option, e.g. to output binary ion: partiql --query="SELECT * FROM input_data" --output-format=ION_BINARY --input=/logs/log.ion To pipe input data in via stdin: cat /logs/log.ion | sqlcli --query="SELECT * FROM input_data" --format=ION_BINARY > output.10n Option Description ------ ----------- -e, --environment <File> initial global environment (optional) -h, --help prints this help -i, --input <File> input file, requires the query option (default: stdin) -o, --output <File> output file, requires the query option (default: stdout) --of, --output-format <OutputFormat: output format, requires the query option (default: PARTIQL) (ION_TEXT|ION_BINARY|PARTIQL)> -q, --query <String> PartiQL query, triggers non interactive mode
PartiQLファイル仕様
以下はチュートリアルで用意されているサンプルデータのうちの1つです。このファイル、良く見てみると一部独自のファイル形式を採用しています。主な仕様は以下の通り。
- PartiQLはSQLテーブルだけでなくJSON,Ion,Parquet等のネストやタプル、半構造化フォーマットで良く見られるデータも扱えるようにするための機能を提供します。この機能を実現するために、PartiQLは論理型システム、PartiQLデータモデルを採用しています。各々のPartiQL実装はJSONやParquet等のデータフォーマットをPartiQLデータモデルに従う形でPartiQLデータセットにマッピングさせる必要があります。
- 入れ子構造とする事でhr.employeesというようなアクセスが可能。
- 区切り文字<<と>>で囲まれている内容は、SQLテーブルの場合同様、データが順不同のコレクション(バッグとも呼ばれる)である事を示しています。この3つのタプル間には順序はありません。
- 単一行コメントを--で記載することが可能。
- SQLとの互換性のために、PartiQLリテラルは一重引用符で囲み、JSONリテラルは二重引用符で囲む。
$ cat Tutorial/code/q1.env { 'hr': { 'employees': << -- a tuple is denoted by { ... } in the PartiQL data model { 'id': 3, 'name': 'Bob Smith', 'title': null }, { 'id': 4, 'name': 'Susan Smith', 'title': 'Dev Mgr' }, { 'id': 6, 'name': 'Jane Smith', 'title': 'Software Eng 2'} >> } }
ファイルからデータをロードする
-eオプションを使い、ファイルをロードする形でpartiqlを起動出来ます。!global_envを使ってグローバル環境に何がロードされているのかを見ることが可能となっており、起動時に指定したデータが参照可能な形となっています。
$ ./bin/partiql -e Tutorial/code/q1.env Welcome to the PartiQL REPL! PartiQL> !global_env | ===' { 'hr': { 'employees': << { 'id': 3, 'name': 'Bob Smith', 'title': NULL }, { 'id': 4, 'name': 'Susan Smith', 'title': 'Dev Mgr' }, { 'id': 6, 'name': 'Jane Smith', 'title': 'Software Eng 2' } >> } } --- OK! (7 ms)
ちなみに、上記「PartiQLファイル仕様」に合致しない形式のファイル(ここではJSONファイル)を読み込ませるとどうなるか確認してみます。内容はこんな感じで。
{ "hr" : { "employees": [ { "id": 3, "name": "Bob Smith", "title": null }, { "id": 4, "name": "Susan Smith", "title": "Dev Mgr" }, { "id": 6, "name": "Jane Smith", "title": "Software Eng 2"} ] } }
オプション引数にファイルを指定。するとエラーとなりました。
$ ./bin/partiql -e Tutorial/code/q1json.env No such binding: id
仕様に沿うようにファイルの内容を以下のように修正。
{ 'hr' : { 'employees': << { "id": 3, "name": "Bob Smith", "title": null }, { "id": 4, "name": "Susan Smith", "title": "Dev Mgr" }, { "id": 6, "name": "Jane Smith", "title": "Software Eng 2"} >> } }
今度はちゃんと読み込めました。
$ ./bin/partiql -e Tutorial/code/q1-edited.env Welcome to the PartiQL REPL! PartiQL>
PartiQLクエリの実行
チュートリアルで該当するSQL(この場合はq1.sql)を実行してみます。データベースにクエリするイメージと全く同じ様な形で、データをクエリする事が出来ました!
PartiQL> SELECT e.id, | e.name AS employeeName, | e.title AS title | FROM hr.employees e | WHERE e.title = 'Dev Mgr' | ===' << { 'id': 4, 'employeeName': 'Susan Smith', 'title': 'Dev Mgr' } >> --- OK! (5 ms)
また、仕様としてPartiQLはSQL-92と後方互換性があります。
ちなみに、チュートリアルで用いる全てのデータを取り込む場合はtutorial-all-data.envを指定すると実現出来ます。
$ ./bin/partiql -e Tutorial/code/tutorial-all-data.env Welcome to the PartiQL REPL! PartiQL>
まとめ
というわけでSQL互換クエリ言語「PartiQL」のチュートリアルを触ってみた内容のご紹介でした。当エントリの内容はチュートリアルの触りの部分となります。まだまだ細かい部分の仕様等もありますので気になる人はチュートリアルを是非実際に動かして確認してみてはいかがでしょうか。
そしてこの「PartiQL」、既にAWSのサービス等でも利用されており、今後も利用可能なサービスは増えていくとの事。AWSにおけるデータアクセスがこれでより一層便利なものになりますね。要注目です!