Redashでクエリを投げてみる

# はじめに

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

# 環境

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列です。
データ項目については[こちら](https://pythondatascience.plavox.info/scikit-learn/scikit-learn%E3%81%AB%E4%BB%98%E5%B1%9E%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88)に詳しく書かれているので、説明は省きます。

まずはこのデータを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 build```と```docker-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への接続について確認していく。
基本的に、下図のように設定すればいいはず。

![setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329888/6300b570-4259-bcb9-22d4-5fce16344048.png)

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

# クエリ発行

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

![newquery.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329888/f015c0cf-324b-290b-b220-f15ccc873e84.png)

# まとめ

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