Kekeの日記

エンジニア、読書なんでも

Apache SupersetでMySQLに入っている家計簿データをかっこよく可視化する

スクリーンショット 2018-08-27 15.03.37.png

本記事

本記事はApache SupersetのmacOSでのインストール、セットアップをして、実際にMySQLにあるデータを可視化しようと思います。

ゴールは以下のようなダッシュボードです。

スクリーンショット 2018-08-27 16.29.03.png

1. Apache Supersetとは

image.png

エンタープライズで使えるモダンなBIアプリケーション

Apache SupersetはApache財団のIncubatorプロジェクトです。

最初の名前はPanoramix、2016年にCaravelになってから、今のSupersetという名前になっています。ちなみにPanoramixはパノラマ、Caravelはカラベラ船の意味で、Supersetは色んな意味があるので分かりませんでした。

2BA3E315-F420-439C-85ED-FC7121693E47.jpeg Caravel

1.1 特徴

  • リッチなデータ可視化
  • データ探索するのに簡単なインターフェース
  • ダッシュボードをシェアできる
  • 認可や認証などの機能を備えている
  • ほとんどのSQLを使うようなソースに対応
  • Apache Druidと高い親和性がある

1.2 スクリーンショット

公式サイトにスクリーンショットがあったので、使わさせていただきます。

image.png

image.png

1.3 使えるデータベース

執筆時では、以下のような感じです。

スクリーンショット 2018-08-25 16.45.48.png

また、データベースに接続するときは、SQLAlchemyを使っているので、プレフィックスをつけないといけません。右側のSQLAlchemy URI Prefixをつければ大丈夫です。

2. macOSにインストールする

python3.x系を想定しています。

pipを使ってインストールします。

pip install superset

そして、adminユーザーを追加します。 以下のコマンドがfabmanagerなのはApache SupersetのサーバーがFlaskでできており、FlaskAppBuilderを使っているからです。

以下のコマンドを打つと対話的にadminユーザを作ることになります。 -appの引数は、applicationを指定するものです。

fabmanager create-admin --app superset

Username [admin]:
User first name [admin]:
User last name [user]:
Email [admin@fab.org]: 
Password:
Repeat for confirmation:
Recognized Database Authentications.
Admin User admin created.

そしてsupersetが使っているDBを初期化します。

superset db upgrade

サンプルが用意されているのでそれも取得します。

superset load_examples

そして、ロールを初期化します。

superset init

最後に起動します。 オプションで-dをつけることによって、バックグラウンドで起動できます。 また-pでポート指定をすることができます。

superset runserver [-d] -p 8098

デフォルトでは0.0.0.0:8092にアクセスすればおっけいです。

usernamepasswordを入力してログインします。

スクリーンショット 2018-08-27 11.39.55.png

すると以下のような画面が出るはずです。

スクリーンショット 2018-08-27 11.43.19.png

3. MySQLに接続したDashboardを作成する

3.0 アーキテクチャ

以下のような構成になっています。

スクリーンショット 2018-08-27 15.03.37.png

クラウドはGoogle Cloud Platformでホスティングされています。

スクリーンショット 2018-08-27 15.15.16.png

3.1 接続用のパッケージをインストロールする

今回はMySQLを使うので入れます。

pip install mysqlclient 

...
Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/1_/wf3rrlpn25184m2rn5qws_lc0000gp/T/pip-install-wxomhldj/mysqlclient/

エラーが出ました。 よくあるエラーらしいです。以下のissueに解決策があります。

github.com

解決方法は

brew install mysql-connector-c

を入れます。

そしてmysql_configの設定の変えます。

sudo vim /usr/local/bin/mysql_config

そして

libs="$libs -l " 

# libs="$libs -l "
libs="$libs -lmysqlclient -lssl -lcrypto"

に変更して、再度実行するとうまくいきます。

$ pip install mysqlclient

Collecting mysqlclient
  Using cached https://files.pythonhosted.org/packages/ec/fd/83329b9d3e14f7344d1cb31f128e6dbba70c5975c9e57896815dbb1988ad/mysqlclient-1.3.13.tar.gz
Installing collected packages: mysqlclient
  Running setup.py install for mysqlclient ... done
Successfully installed mysqlclient-1.3.13

3.2 データベースを接続する

まず、Databaseを押して、設定を開きます。

スクリーンショット 2018-08-27 11.46.45.png

そして、右上の+を押します。

image.png

特に設定しないといけないものは以下の通りです。

スクリーンショット 2018-08-27 12.43.27.png

指定方法は以下の遠いです。

mysql://[username]:[password]@[host]:[port]/[データベース名]

なので自分の場合は

mysql://root:@127.0.0.1:3306/yamashita_bank

です。

注意点があるのですがlocalhostは認識してくれず、127.0.0.1としなければなりませんので、気をつけてください。

stackoverflow.com

下のTest Connectionで接続をテストします。

スクリーンショット 2018-08-27 13.31.46.png

また、接続用のパッケージを入れていないと、以下のようなエラーが出ます。

スクリーンショット 2018-08-27 13.06.23.png

接続テストが通ったらSaveを押します。

スクリーンショット 2018-08-27 14.01.33.png

データベースができていることを確認できます。

スクリーンショット 2018-08-27 14.04.55.png

3.3 Tableを作成する

これまではデータベースを接続することまではやりました。 しかし、これだけでは使うことができません。

Tableは、「どのテーブルにクエリを投げるか」の設定

Sources -> Tablesで選択します。 すこし公式チュートリアルとUIが変わっていますが、選択する項目な同じです。

スクリーンショット 2018-08-27 14.18.31.png

同様に+ボタンを押します。

スクリーンショット 2018-08-27 14.19.07.png

すると以下のような設定でSaveをします。

スクリーンショット 2018-08-27 14.47.54.png

3.4 Sliceを作成する

3.4.1 Sliceを作成する前の設定

保存されているクエリをスライスと呼びます。

以下のEdit Recordからスライスを設定します。

スクリーンショット 2018-08-27 14.51.31.png

押すと以下のようなが画面が開かれます。

それぞれのタブの役割は

  • Detail: Table自体の詳細
  • List Colums: フィールドの設定
  • List Metrics: メトリックスを表示

です。

私のLine Botのデータベースは以下のようなスキーマになっています。

スクリーンショット 2018-08-27 14.55.12.png

List Columnsだけ解説すると

設定値  概要
Groupable GROUP BYを使ってもいいのか設定
Filterable WHEREを使ってもいいのかを設定
Is temporal 調査中です。

3.4.2 Sliceを設定する

今度はEdit Recordではなくて、そのテーブル名を選択します。

すると以下のような画面が出ます。

スクリーンショット 2018-08-27 15.18.59.png

左側の欄では以下のようなことな可視化方法を設定することができます。

スクリーンショット 2018-08-27 15.32.19.png

スクリーンショット 2018-08-27 15.33.15.png

時系列で、複雑ではないので、適当に選択しておきます。

まず、いつからデータを可視化するかなどとという時間的な範囲をTimeで設定します。

スクリーンショット 2018-08-27 15.37.50.png

  • Time Column: どれを時間軸にするか。フィールドの型がTimestamp出ないと使うことができません。
  • Time Grain: どれくらいの粒度で。group byと思って貰えば良さそうです。
  • Since: いつから。
  • Until: いつまで。

一例だと以下のようなSQLのようなイメージです。

where updated_at > [SINCEの設定値] 

次にGROUP BYに設定をします。

スクリーンショット 2018-08-27 15.46.48.png

設定はできたので、実行してみます。

以下のような結果になりました。

スクリーンショット 2018-08-27 15.47.45.png

目的とする決算もできています。

スクリーンショット 2018-08-27 15.51.41.png

Pie Chartを選択すると以下のようになります。

スクリーンショット 2018-08-27 15.54.22.png

あとはSliceに名前をつけてSaveで保存します。

スクリーンショット 2018-08-27 15.56.33.png

ベストプラクティスとしては、**`[Table名]-[Sliceの対象][可視化方法]で名前をつけると管理しやすいです。

Saveを押すと以下のようなモーダルがでできます。

スクリーンショット 2018-08-27 15.59.18.png

まだ、DashBoardは作成していないので、Add to new dashboardを選択して、作ります。

また、同様の手順でいくつかスライスを作って、ダッシュボードに追加します。

3.5 DashBoardを見てみる

以下のようにDashBoardを作りました。

スクリーンショット 2018-08-27 16.22.05.png

3.6 DashBoardをカスタマイズする

余白が多かったり、スライスをスクロールで見ないといけなかったりするので、カスタマイズします。

以下のEdit DashBoardを押してください。

スクリーンショット 2018-08-27 16.23.50.png

かなりできることが多いのがわかります。

あまりすることはないので、適当にマークダウンを追加して終わりにします。

スクリーンショット 2018-08-27 16.29.03.png