Apache SupersetでMySQLに入っている家計簿データをかっこよく可視化する
本記事
本記事はApache SupersetのmacOSでのインストール、セットアップをして、実際にMySQLにあるデータを可視化しようと思います。
ゴールは以下のようなダッシュボードです。
1. Apache Supersetとは
エンタープライズで使えるモダンなBIアプリケーション
Apache SupersetはApache財団のIncubatorプロジェクトです。
最初の名前はPanoramix、2016年にCaravelになってから、今のSupersetという名前になっています。ちなみにPanoramixはパノラマ、Caravelはカラベラ船の意味で、Supersetは色んな意味があるので分かりませんでした。
Caravel
1.1 特徴
- リッチなデータ可視化
- データ探索するのに簡単なインターフェース
- ダッシュボードをシェアできる
- 認可や認証などの機能を備えている
- ほとんどのSQLを使うようなソースに対応
- Apache Druidと高い親和性がある
1.2 スクリーンショット
公式サイトにスクリーンショットがあったので、使わさせていただきます。
1.3 使えるデータベース
執筆時では、以下のような感じです。
また、データベースに接続するときは、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
にアクセスすればおっけいです。
username
とpassword
を入力してログインします。
すると以下のような画面が出るはずです。
3. MySQLに接続したDashboardを作成する
3.0 アーキテクチャ
以下のような構成になっています。
クラウドはGoogle Cloud Platformでホスティングされています。
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に解決策があります。
解決方法は
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を押して、設定を開きます。
そして、右上の+
を押します。
特に設定しないといけないものは以下の通りです。
指定方法は以下の遠いです。
mysql://[username]:[password]@[host]:[port]/[データベース名]
なので自分の場合は
mysql://root:@127.0.0.1:3306/yamashita_bank
です。
注意点があるのですがlocalhost
は認識してくれず、127.0.0.1
としなければなりませんので、気をつけてください。
下のTest Connection
で接続をテストします。
また、接続用のパッケージを入れていないと、以下のようなエラーが出ます。
接続テストが通ったらSave
を押します。
データベースができていることを確認できます。
3.3 Tableを作成する
これまではデータベースを接続することまではやりました。 しかし、これだけでは使うことができません。
Tableは、「どのテーブルにクエリを投げるか」の設定
Sources -> Tables
で選択します。
すこし公式チュートリアルとUIが変わっていますが、選択する項目な同じです。
同様に+
ボタンを押します。
すると以下のような設定でSave
をします。
3.4 Sliceを作成する
3.4.1 Sliceを作成する前の設定
保存されているクエリをスライスと呼びます。
以下のEdit Record
からスライスを設定します。
押すと以下のようなが画面が開かれます。
それぞれのタブの役割は
Detail
: Table自体の詳細List Colums
: フィールドの設定List Metrics
: メトリックスを表示
です。
私のLine Botのデータベースは以下のようなスキーマになっています。
List Columns
だけ解説すると
設定値 | 概要 |
---|---|
Groupable |
GROUP BY を使ってもいいのか設定 |
Filterable |
WHERE を使ってもいいのかを設定 |
Is temporal |
調査中です。 |
3.4.2 Sliceを設定する
今度はEdit Record
ではなくて、そのテーブル名を選択します。
すると以下のような画面が出ます。
左側の欄では以下のようなことな可視化方法を設定することができます。
時系列で、複雑ではないので、適当に選択しておきます。
まず、いつからデータを可視化するかなどとという時間的な範囲をTime
で設定します。
Time Column
: どれを時間軸にするか。フィールドの型がTimestamp
出ないと使うことができません。Time Grain
: どれくらいの粒度で。group by
と思って貰えば良さそうです。Since
: いつから。Until
: いつまで。
一例だと以下のようなSQLのようなイメージです。
where updated_at > [SINCEの設定値]
次にGROUP BY
に設定をします。
設定はできたので、実行してみます。
以下のような結果になりました。
目的とする決算もできています。
Pie Chart
を選択すると以下のようになります。
あとはSliceに名前をつけてSave
で保存します。
ベストプラクティスとしては、**`[Table名]-[Sliceの対象][可視化方法]で名前をつけると管理しやすいです。
Save
を押すと以下のようなモーダルがでできます。
まだ、DashBoardは作成していないので、Add to new dashboard
を選択して、作ります。
また、同様の手順でいくつかスライスを作って、ダッシュボードに追加します。
3.5 DashBoardを見てみる
以下のようにDashBoardを作りました。
3.6 DashBoardをカスタマイズする
余白が多かったり、スライスをスクロールで見ないといけなかったりするので、カスタマイズします。
以下のEdit DashBoard
を押してください。
かなりできることが多いのがわかります。
あまりすることはないので、適当にマークダウンを追加して終わりにします。