Redashでクエリを投げてみる


はじめに

先日Redashをローカル環境にインストールしたので、今回はデータベースにデータを入れて、Redashでクエリを投げるところまでを実施します。
Redashのインストールについてはこちらをご覧ください。

環境

MacBookAirを使用しています。OSなどは次の通りです。

$sw_vers
ProductName:    Mac OS X
ProductVersion: 10.13.6
BuildVersion:   17G14033

$python --version
Python 3.7.3

$docker --version
Docker version 20.10.0, build 7287ab3

Redashを起動した状態を想定しています。

$docker container ls
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                            NAMES
caa3348d587a   redash_scheduler      "/app/bin/docker-ent…"   43 minutes ago   Up 42 minutes   5000/tcp                                         redash_scheduler_1
00e34fe2ef97   redash_worker         "/app/bin/docker-ent…"   43 minutes ago   Up 42 minutes   5000/tcp                                         redash_worker_1
0f60c28cecbd   redash_server         "/app/bin/docker-ent…"   43 minutes ago   Up 43 minutes   0.0.0.0:5000->5000/tcp, 0.0.0.0:5678->5678/tcp   redash_server_1
518d2c7aad0d   postgres:9.5-alpine   "docker-entrypoint.s…"   43 minutes ago   Up 43 minutes   0.0.0.0:15432->5432/tcp                          redash_postgres_1
c1e85b4cfa69   redis:3-alpine        "docker-entrypoint.s…"   27 hours ago     Up 27 hours     6379/tcp                                         redash_redis_1
d32426258263   djfarrelly/maildev    "bin/maildev --web 8…"   27 hours ago     Up 27 hours     25/tcp, 0.0.0.0:1080->80/tcp                     redash_email_1

データ準備

データは簡単に手に入るscikit-learnのボストンデータセットを使用します。
ボストンの住宅価格のデータで、506行14列です。
データ項目についてはこちらに詳しく書かれているので、説明は省きます。

まずはこのデータをscikit-learnから取ってきて、csvファイルにダンプしようと思います。
そのためにpythonのコードを実行します。

data.py
import pandas as pd
import sklearn.datasets as skd

data = skd.load_boston()
df_X = pd.DataFrame(data.data, columns=data.feature_names)
df_y = pd.DataFrame(data.target, columns=['y'])
df = pd.concat([df_X, df_y], axis=1)
df.to_csv('data.csv', index=True, index_label='ID')

python data.pyで実行すると、data.csvが作成されます。
これをこの後、DBに投入します。

データベースの準備

今回はデータベースはRedashを起動するときに作成されるPostgreSQLを使用します。
先ほどのcsvファイルや、sqlファイルをdocker-composeで作成されたコンテナ内に持っていきたいので、ローカルのフォルダをマウントしておきます。

docker-composeの設定を少し変えたいので、以下のファイルについて、61行目、62行目を追加しました。

docker-compose.yml
(中略)
50   postgres:
 51     image: postgres:9.5-alpine
 52     # The following turns the DB into less durable, but gains significant performance improvements for the tests run (x3
 53     # improvement on my personal machine). We should consider moving this into a dedicated Docker Compose configuration for
 54     # tests.
 55     ports:
 56       - "15432:5432"
 57     command: "postgres -c fsync=off -c full_page_writes=off -c synchronous_commit=OFF"
 58     restart: unless-stopped
 59     environment:
 60       POSTGRES_HOST_AUTH_METHOD: "trust"
 61     volumes:
 62       - ../data:/tmp/data
(中略)

docker-compose builddocker-compose up -dを実行して、設定を反映させます。

データベース作成とテーブル作成用のsqlファイルを作成しておきます。

data/setup_db.sql

DROP DATABASE IF EXISTS boston_datasets;

CREATE DATABASE boston_datasets;
setup_tbl.sql
CREATE TABLE realestate
(
ID INTEGER,
CRIM NUMERIC,
ZN NUMERIC,
INDUS NUMERIC,
CHAS NUMERIC,
NOX NUMERIC,
RM NUMERIC,
AGE NUMERIC,
DIS NUMERIC,
RAD NUMERIC,
TAX NUMERIC,
PTRATIO NUMERIC,
B NUMERIC,
LSTAT NUMERIC,
y NUMERIC
);

上2つのsqlファイルを実行。

$docker-compose run --rm postgres psql -f /tmp/data/setup_db.sql -h postgres -U postgres 
Creating redash_postgres_run ... done
DROP DATABASE
CREATE DATABASE
$cat  ../data/setup_db.sql 
DROP DATABASE IF EXISTS boston_datasets;

CREATE DATABASE boston_datasets;

(base) DyamaguchiMBA:redash $docker-compose run --rm postgres psql -f /tmp/data/setup_tbl.sql -h postgres -U postgres -d boston_datasets
Creating redash_postgres_run ... done
CREATE TABLE

コンテナに入って確認。

$docker exec -it redash_postgres_1 bash
bash-5.0# psql -U postgres -h postgres -d boston_datasets
psql (9.5.24)
Type "help" for help.

boston_datasets=# \dt
           List of relations
 Schema |    Name    | Type  |  Owner   
--------+------------+-------+----------
 public | realestate | table | postgres
(1 row)

boston_datasets=# \q
bash-5.0# exit

確かにrealestateテーブルが作成できている。
このテーブルに対して、csvファイルのデータを挿入。

$docker-compose run --rm postgres psql -h postgres -U postgres -d boston_datasets -c "copy realestate from  '/tmp/data/data.csv' encoding 'utf8' csv header delimiter ','"
Creating redash_postgres_run ... done
COPY 506

ここまででデータベース、テーブル、データがPostgreSQLに入ったことになる。

Redashの設定

次にRedashからPostgreSQLへの接続について確認していく。
基本的に、下図のように設定すればいいはず。

ここでPasswordは空欄でOK。
念のため、Test Connectionを実施して、正しく接続を確認した。

クエリ発行

画面左の「Queries」からデータソースを選択すると、先ほど作ったDBやテーブルが見える。
SQLとしてselect * from realestateを実行してみると、下図のように結果が返ってきました。

まとめ

データの準備からクエリ発行まで実施しました。
次はいよいよ可視化していきたいと思います。