helloworlds

not a noun, it's a verb

【AWS】かなり気になる! PartiQLを触ってみた! (入門)

今回は、2019年8月にAWS公式から発表された、

PartiQL を触ってみようと思います!

個人的にかなり気になるクエリ言語ですので、簡単にチュートリアル的な部分を見ていきます!

それでは、まずは概要からみていきましょう!

※ この記事を書いた当初の情報のみ記載しております。後ほどのアプデなどで変更されている点を考慮し、読んでください。

PartiQLとは??

一言で言うと、

データを効率的に問い合わせ可能にするSQL互換の問い合わせ言語 (引用: 下記ブログより)

らしいですな。

これはもしや.....

そう、会社でよくあるデータ移行や、先人達が勝手に(勝手ではないか!w)導入してきたDBなりファイルサーバー、またはデータをまとめたCSVファイル達を容易に操作できるものなのでは?

クエリエンジンがPartiQLをサポートしていれば、リレーショナルデータベース(トランザクションとアナリティクスのどちらも)、オープンなデータフォーマットの半構造化データや入れ子形式のデータ(Amazon S3データレイクなど)、そしてNoSQLのスキーマレスなデータや行ごとに異なる属性を持つことを許容するドキュメントデータベースなども対象となります。(引用: 下記ブログより)

やっぱり!!!これは期待できそうですね!

以下、公式の発表されたブログになります。(英語)

aws.amazon.com

f:id:o21o21:20190816105725p:plain

(図引用: 上記ブログより)

リリースの経緯

けっこう便利そうなサービス。

どうしてリリースしたのでしょうか?

これも上記ブログより引用ですが、Amazonの社内ではすでに使用されてるとのこと。

すごい。。。

ってことは、やはりEC事業として、部署間でのデータの相互性が問題だったのだろうか?

ブログの"Why we built it"に記載がありました。

Chris Suver率いるAmazonの小売事業は、SQLに似たクエリ言語を追求していた。

既存のSQLの知識を活かすようなものを開発する必要があったと書いてあります。

つまり、AWSはこれまでRDBなどたくさんのDBに関するサービスはリリースしてきたが、より互換性を保つために、

ネストされたデータや半構造化されたデータを処理するのに必要な能力を備えながら、SQLに非常に近いままで使用できるクエリ言語を開発したのでしょう。

PartiQLAWS(Amazon)社内の問題解決のために開発されたツールといってもいいでしょう。

非常に感激してしまいます。さすが世界の頭脳集団があつまっている組織です。

では、発表された特徴を見てみましょう。

特徴

  • SQL compatibility (SQLの互換性)
  • First-class nested data (ネストされたデータに特化)
  • Optional schema and query stability (オプションのスキーマとクエリの安定性)
  • Minimal extensions (最小限の拡張)
  • Format independence (フォーマットの独立)
  • Data store independence (データストアの独立)

なんとなくイメージできますかね?

とりあえず触れてみるのは良さそうです!

さわってみる

とりあえず触ってみよう!ということで、チュートリアル的なものがGithubにて公開されています。

インストールして動かしてみるところまでが、この記事のゴールです。

わたしの環境は、macOSです。 また、JVMがインストールされている環境であることが前提になります。

え!最近mac買ってまだJavaインストールしてないわ!

あ!OracleJDK有償化で手順違うやんけ!なんかめんどくさ!

って方は、以下の記事を参考にしてみてください!!

o21o21.hatenablog.jp

こちらPartQLの公式サイトです。

PartiQL

インストール

こちらより、手動でもwgetでもいいので、ローカルに展開します。

github.com

wgetをインストールしてない場合は、 $ brew install wgetwgetをインストールしましょう。

$ wget https://github.com/partiql/partiql-lang-kotlin/releases/download/v0.1.0-alpha/partiql-cli-0.1.0.tgz
$ tar -zxvf partiql-cli-0.1.0.tgz

$ ll
README  
Tutorial   # pdfおよびhtml形式のチュートリアルが含まれています。サブフォルダーコードには、3種類のファイルが含まれる
bin          # macOSおよびUnixシステム用の起動スクリプトpartiqlおよびWindowsシステム用のpartiql.batが含まれる
lib           # PartiQLの実行に必要なすべてのJavaライブラリ

起動してみる

では、PartiQLを起動してみます。

$ ./bin/partiql
Welcome to the PartiQL REPL!

PartiQL>

こんなかんじで起動できたらOKです!

OK! (0 ms) って出てくるのは、クセでEnterを連打すると出てくるようです。

これは、Enterを2回連打でクエリが実行される仕様なのだそうです。

終了は、ctr + d です。

ちょっと試してみる

チュートリアルにもあるのですが、少しクエリを実行してみます。

  • SELECTしてみる
PartiQL> SELECT * FROM [1,2,3]
   | 
===' 
<<
  {
    '_1': 1
  },
  {
    '_1': 2
  },
  {
    '_1': 3
  }
>>
--- 
OK! (114 ms)
  • ファイルを読み込む( -e )

Tutorialディレクトリにサンプルファイルをあります。

それを読み込んで、環境変数!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! (12 ms)

少しこのサンプルファイル(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'}
        >>
    }
} 
  • このようなJSON形式のデータの場合、hr.employeesのようにしてテーブルとして扱いが可
  • --でコメントを記述
  • <<>>は、データが順不同のコレクション(バッグ)。コレクション=配列のようなイメージ(タブル間の順序はなし)
  • PartiQLリテラルは単一引用符で囲まれていますが、JSONリテラルは二重引用符で囲まれる
  • ↑ PartiQL( 'employees': <<..... )とJSON( "employees": [... )

では、上記のサンプルデータを元に参照してみます。

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! (6 ms)

すごい!

  • ジョイン
PartiQL> SELECT e.id AS id, 
   | e.name AS employeeName,
   | e.title AS title,
   | p.name AS projectName
   | FROM hr.employeesNest AS e LEFT JOIN e.projects AS p
   | 
===' 
<<
  {
    'id': 3,
    'employeeName': 'Bob Smith',
    'title': NULL,
    'projectName': 'AWS Redshift Spectrum querying'
  },
  {
    'id': 3,
    'employeeName': 'Bob Smith',
    'title': NULL,
    'projectName': 'AWS Redshift security'
  },
  {
    'id': 3,
    'employeeName': 'Bob Smith',
    'title': NULL,
    'projectName': 'AWS Aurora security'
  },
  {
    'id': 4,
    'employeeName': 'Susan Smith',
    'title': 'Dev Mgr'
  },
  {
    'id': 6,
    'employeeName': 'Jane Smith',
    'title': 'Software Eng 2',
    'projectName': 'AWS Redshift security'
  }
>>
--- 
OK! (65 ms)

同様にして、サブクエリもできました!

まとめ

PartiQLのチュートリアルを元にして触ってみました。

データもサンプルデータをもとにして簡単に用意して色々触ることができそうです。

今後利用可能なAWSサービスもどんどんできてくると思うので、覚えておいて損はなさそうです。

学習コストもそんな高くないと思うので、今後の情報もキャッチアップしていくと良さそうです!

以上.