35
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Fringe81Advent Calendar 2017

Day 9

Jupyter NotebookのようにSQLを実行できるFranchiseについて

Last updated at Posted at 2017-12-10

Index

  1. Franchiseとは
  2. 実行環境の整備
  3. クエリ発行と可視化
  4. まとめ

Franchiseとは

掲題のような、Notebook式にSQLを発行して分析を行うためのツールで、アップロードしたファイルやMySQL, BigQueryなどに対してクエリを発行することができます。

できることは明確なのでfranchiseが何物なのかという説明は上記の通りでしかないのですが、仕組みが特殊なのでここではそれを解説します。

Jupyter NotebookはサーバサイドのWebアプリケーションですが、franchiseは同じWebアプリケーションでも、JavaScriptで実装されたフロントエンドのSPAです。
と聞くと、幾つかんっ!?っとなる点があるのではないでしょうか。たとえば

  1. データをどこに保存しているのか?
  2. ブラウザからMySQLやPostgreSQLにはどのように接続するのか?

ということが気になるかと思います。それぞれについて説明します。

  1. データをどこに保存しているのか?

例えばDBの接続情報や、cscやexcelファイルをアップロードした場合どのように保存されるかということで、LocalStorageを利用しています。ファイルをアップロードについてはWebWorkerによりバックグラウンドで実行されており、SQLiteのファイルを生成してLocalStorageに保存するという振る舞いをしています。具体的な実装は以下を参照ください。
https://github.com/HVF/franchise/tree/master/src/db/sqlite

  1. ブラウザからMySQLやPostgreSQLにはどのように接続するのか?

Franchiseはブラウザで実行するアプリケーションなので、当然ですがMySQLやPostgreSQLなどのDBサーバと直接接続することはできません。そこで、 franchise-clientというDB接続のブリッジをwebsocketによって行うアプリケーションを自PC上で実行することで実現しています。

ここまでの説明を図に起こすと以下のようになります。

image.png

実行環境の整備

franchiseがどのようなものかを解説したところで、こんどは実際に動かしてみます。

前述の通りfranchiseはクライアントサイドのアプリケーションなので、手元で実行しなくてもクラウド上 (https://franchise.cloud/app/ ) にデプロイされているものが localhost:14645 のfranchise-clientを探しに行くようになっていますし、データは一切リモートホストに対して送信されることはないのです。ゆえに本来franchiseはビルドも実行もしなくてもいいのですが、今回は手元で動かしてみることとします。

franchise

以下実行すると http://localhost:3000 でフロントエンドのアプリケーションが実行されます

git clone https://github.com/HVF/franchise.git
cd franchise

npm install
npm start

franchise-client

リポジトリのREADMEに書いてないのですが、以下実行することで起動できます。

npx franchise-client

npxについてはここでは詳しく書きませんが、以下Qiitaがわかりやすいです。
https://qiita.com/vvakame/items/23b02e950ca307b9e674

npxをインストールしておらず、ソースをcloneしてくる場合は以下の通り。

git clone https://github.com/antimatter15/franchise-client.git
cd franchise-client

npm install
node server.js

面倒なときはDocker Composeで

以下のようなDockerfileを用意しておきました。
https://gist.github.com/jsoizo/7beb4b7d9d6a68f6a60e212f6f7b82b5#file-franchise-docker-compose-yml

franchise-docker-compose-yml
version: '2.2'
services: 
  web:
    ports: 
      - "3000:80"
    image: "jsoizo/franchise"
  client:
    ports: 
      - "14645:14645"
    init: true
    image: "jsoizo/franchise-client"

イメージ jsoizo/franchisejsoizo/franchise-client はそれぞれforkしてDockerfileを作成したブランチをpushしたものです。

https://github.com/jsoizo/franchise
https://github.com/jsoizo/franchise-client

クエリ発行と可視化

BigQueryにはGitHubのデータが公開されているので、それを使って試してみます。

image.png

2017年に最も多くのcommitをしたどえらいユーザが誰なのかを見てみましょう。
クエリウィンドウに入力して実行すると、表が返却されます。グラフのオプションは実行結果から動的に決まり、例えばGeoデータが出力されたら地図上にプロットするオプションが現れます。とはいえ、Excelほどには細かいグラフの表示制御はできないので、その場合はcsvやtsvでダウンロードすると良いでしょう。

franchise_bigquery_sample.mov.gif

GitHub ですね。。。これが誰なのかは本題ではないので、無視して他のクエリを発行してみます。
+ アイコンをクリックすると次のクエリ発行画面がレンダリングされるので、同様にGitHubの2016年の日別commit数を出力してみます。

franchise_bigquery_sample2.mov.gif

ギザギザしていますね。おそらく曜日で土日が少ないのでしょう。ということで次は曜日ごとに集計をかけた結果を出力してみましょう。というように、順を追って調査を行うことができます。

よく使う用途としてはレポートとして出したいなどがあると思いますが、その時のために、htmlとして出力することができます。このとき、ダウンロードオプションとして Download with credentials というものがありますが、これはBigQueryなりRDBMSの接続情報を同時に渡すオプションです。人に渡したりリポジトリ管理する場合は気をつけましょう。

franchise_bigquery_sample3.mov.gif

出力されたhtmlを開くと、JavaScriptが動き出し、動いているfranchise( localhost:3000 で動いていない場合は franchise.cloud/)の receiver.html にPOSTすることで当該レポートを開くようになっています。

franchise_bigquery_sample4.mov.gif

まとめ

  • franchiseはJupyter NotebookのようにSQLの実行結果を記録しつつ分析を進めるためのOSS
  • franchise-clientを任意のサーバで動かことでMySQL, PostgreSQLやBigQueryに接続可能
  • SQLの実行結果はhtmlとして出力可能で、開くと結果を再現させることができる

それではよい分析ライフを!!!

35
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?