話題の記事

AWSのデータストアやフォーマットに依存しない問い合わせが可能に。オープンソースとして公開されたSQL互換クエリ言語「PartiQL」を触ってみた

2019.08.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

先日、SQL互換の新しい問い合わせ言語およびそのリファレンス実装となる「PartiQL」がオープンソースとして公開されました。

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ファイル)を読み込ませるとどうなるか確認してみます。内容はこんな感じで。

Tutorial/code/q1json.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"}
        ]
    }
}

オプション引数にファイルを指定。するとエラーとなりました。

$ ./bin/partiql -e Tutorial/code/q1json.env
No such binding: id

仕様に沿うようにファイルの内容を以下のように修正。

Tutorial/code/q1-edited.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"}
        >>
    }
}

今度はちゃんと読み込めました。

$ ./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におけるデータアクセスがこれでより一層便利なものになりますね。要注目です!