Redash API を使ってクエリ結果を取得してみました

Redash Advent Calendar 2017 17日目の記事です。





わたしは最近Pythonに興味を持つようになりまして、
データ可視化のためにJupyter Notebook という実行環境でpythonを実行しています。
このJupyterからもMySQLに接続はできるのですが、
複数データベースからの取得が難しいようなので、
Redash APIを使ってJupyterからredashのクエリ結果をを取得してみました。






jupyterとは



Jupyter Notebook とは、ブラウザで動作するプログラムの対話型実行環境です。

ノートブックと呼ばれるドキュメントを作成してプログラムを実行し、実行結果を記録しながらデータの分析作業をするためのツールです。
そのほか、メモの作成や保存、共有などをブラウザ上で行うことができます。
使用するにはPythonの環境が必要です。

導入方法や操作などは下記サイトを参考にしていただければと思います。



Jupyter Notebook を使ってみよう – Python でデータサイエンス






redashの環境構築



下記を参考にredashを起動しました。



github.com






redashでクエリを作成



下記のクエリを実行後、保存します。



SELECT *
FROM city
WHERE CountryCode = 'JPN'
ORDER BY Population DESC;





実行後の結果はこのようになります。



f:id:mtomitomi:20171216204733p:plain



f:id:mtomitomi:20171216205009p:plain






Jupyterで実行



redashのAPI KEY を確認



redashのクエリ結果を取得するために API KEY が必要になるので、
redashの設定画面で確認します。

右上に表示されているユーザー名をクリックして設定画面へいきます。



f:id:mtomitomi:20171216205242p:plain





設定画面の API KEY のタブをクリックすると確認できます。



f:id:mtomitomi:20171216205516p:plain






1. RedashDynamicQueryをインストール



jupyterからpipコマンドでRedashDynamicQueryをimportします。



!pip install redash-dynamic-query





下記のようにSuccessfullyが出力されることを確認します。



Collecting redash-dynamic-query
Downloading redash-dynamic-query-1.0.1.tar.gz
....

Successfully installed pystache-0.5.4 redash-dynamic-query-1.0.1





下記を参考にしました。



github.com






2. 必要なライブラリをimport



jupyterで下記コマンドを実行します。



from redash_dynamic_query import RedashDynamicQuery
import pandas as pd
import json






3. クエリ結果をjsonで取得



redashで実行したクエリを取得します。取得結果はjsonになります。



redash = RedashDynamicQuery(
endpoint='http://localhost/',
apikey='{redashのAPI KEYを設定}',
#取得したいデータソースIDを設定
data_source_id=1
)

#取得したいクエリIDを設定
query_id = 2
bind = {
"start_date": '2017-01-01T00:00:00',
"end_date": '2017-12-31T23:59:59',
}

#redashのクエリ結果を取得
result = redash.query(query_id, bind)
res = result['query_result']['data']

#jsonを整形
res_format_json = json.dumps(res, indent=4, separators=(',', ': '))

print(res_format_json)





redashで実行したクエリの結果がjsonで取得されます。

見づらいため、整形してjupyterに出力しています。



{
"rows": [
{
"Name": "Tokyo",
"CountryCode": "JPN",
"ID": 1532,
"District": "Tokyo-to",
"Population": 7980230
},
{
"Name": "Jokohama [Yokohama]",
"CountryCode": "JPN",
"ID": 1533,
"District": "Kanagawa",
"Population": 3339594
},
{
"Name": "Osaka",
"CountryCode": "JPN",
"ID": 1534,
"District": "Osaka",
"Population": 2595674
},
{
"Name": "Nagoya",
"CountryCode": "JPN",
"ID": 1535,
"District": "Aichi",
"Population": 2154376
},
{
"Name": "Sapporo",
"CountryCode": "JPN",
"ID": 1536,
"District": "Hokkaido",
"Population": 1790886
},
....






4. jsonを整形して出力



先ほどの結果をさらに見やすくしたいため、表形式で出力します。



redash = RedashDynamicQuery(
endpoint='http://localhost/',
apikey='{redashのAPI KEYを設定}',
#取得したいデータソースIDを設定
data_source_id=1
)

#取得したいクエリIDを設定
query_id = 2
bind = {
"start_date": '2017-01-01T00:00:00',
"end_date": '2017-12-31T23:59:59',
}

#redashのクエリ結果を取得
result = redash.query(query_id, bind)
res = result['query_result']['data']

#jsonファイルを作成し、クエリ結果を出力
f = open('output.json', 'w')
json.dump(res['rows'], f)

#変換したいjsonファイルを読込
df = pd.read_json("output.json")

#csvファイルに変換
df.to_csv("output.csv")
csv_data = pd.read_csv('output.csv')

#表形式で出力
csv_data = pd.read_csv('output.csv')
csv_data[['ID', 'Name', 'CountryCode', 'District', 'Population']]





表形式で表示されるようになりました。



f:id:mtomitomi:20171216214519p:plain






やってみた感想



今回はredashから取得したクエリ結果をそのまま出力していますが、
なにか処理を加えたい場合はRedash API を使ってjupyterで実行できるので便利です。

redashは複数のデータソースからもデータが取得できるみたいですし、
jupyterでもやっているグラフ化などもできるので、改めてredashの便利さを実感しました。





薄々感じてはいますが...jupyterでやらなくてもredashでpython実行したほうがラクなのではないかとも思っています。
まだredashでpythonを使ったことがないので、他の皆さんの記事を参考にやってみたいと思っています。





ちなみに、最近AWSに興味を持ち始めて無料枠付きのアカウントを取得しまして、Amazon Athenaのクエリ結果をredashで出力させてみたかったのですが、
Athenaは無料枠に入っていないらしく、クエリによっては高い課金がされてしまうようなので断念しました。

redash v2.0.0 からAmazon Athenaがサポートされ、Proxy不要でRedash本体から直接Amazon Athenaにクエリを実行できるようになったようです。
AWSと接続できる点でもredashは魅力的だと思います。





とりあえず、Redash API 使えます!という紹介でした。