概要
Redashで異なるデータソースのデータをJoinして表示するための方法を説明したいと思います
結論から言いますと、(2017.6.11時点)異なるデータソースをJoinする機能はまだ公式リリースされていない(リリース延期?)
そのためこの機能を実現するには、Pythonで自力でマージする必要があります。自力でやらなきゃいけないと聞くとやる気がなくなると思いますが、逆に言うとRedashが対応していないこともPythonで好きに作れるのであれもこれも出来ちゃいます!実装方法も簡単なのでがんばりましょう!
また、RedashではSalesforceのデータソースに対応しているが、完成度がイマイチなこと(複数階層のリレーションを参照できない)もあり、この方法で対応できるかと思います
準備
Python Scriptの有効化
環境変数REDASH_ADDITIONAL_QUERY_RUNNERS = "redash.query_runner.python"
を追加
参考:Re:dash の Python データソースで複数のクエリーの結果を組み合わせる
データソースにPythonを追加
※Pythonコードでimportするライブラリは予め「Modules to import prior to running the script」に追加する必要がある
実装
実装は至ってシンプルです
ループでガラガラっぽんするだけですw
例)ユーザIDに一致するユーザ名をユーザ情報データソースから取得する
python初心者なのでご了承ください。。。
# 日付=>文字列変換用
from datetime import datetime
# クエリの実行
# get_query_result(クエリ番号)またはexecute_query('データソース名', sql文)でデータを取得
users = get_query_result(1) # user id datasource
userinfo = get_query_result(2) # user info datasource
result = {} # データ表示用のオブジェクト
# user id: user nameのマップを作成
mapUserName = {}
for row in userinfo['rows']:
# id = user id
# name = user name
mapUserName[row['id']] = row['name']
# mapUserNameに一致するuser nameを取得
for row in users['rows']:
row['username'] = mapUserName[row['userid']]
row['date'] = row['date'].strftime("%Y-%m-%d %H:%M") # 日付型を文字列に変換
# 結果表示用に行データをセット(1行ずつ)
add_result_row(result, {'userid': row['userid'],
'username::filter': row['username'], # 絞り込み用フィルタ項目
'date': row['date']})
# 結果表示用の列定義
add_result_column(result, 'userid', '', 'string')
add_result_column(result, 'username::filter', '', 'string') # 絞り込み用フィルタ項目
add_result_column(result, 'date', '', 'string')
解説
クエリの実行
定義済みのクエリを利用する場合はget_query_result(クエリ番号)
個別(動的なSQL)で実装する場合は、execute_query('データソース名', sql文)
クエリ番号は「queries」のurlから取得します
「http://localhost/queries/18 」なら「18」
データ取得
queryで取得したデータはrowsプロパティ配下に格納されます
日付のフォーマット
redashでは以下の設定を追加することで日付をフォーマットしてくれます
環境変数にREDASH_DATE_FORMAT: "YYYY/MM/DD"
を追加
ただし、日付データは表示結果テーブルでは整形されますが、「Pivot Table」では整形されない
なので、文字列に変換してから出力するようにしています
フィルタ表示
結果表示テーブルにデータを絞り込む用のフィルタリング項目を追加することができます
項目名に::filter
または ::multi-filter
を追加
SalesforceではSelect句にAS エイリアスを付与することができないので、この方法を用いてフィルタリング項目として設定できます
行データの定義
add_result_row(result, {'カラム名1': '値', 'カラム名2': '値'})
列定義
add_result_column(result, 'カラム名1', '', 'string')
add_result_column(result, 'カラム名2', '', 'integer')
Tips
CLIでユーザ追加
> ./manage.py users create {user name} {user's email}
CLIでユーザPW変更
> ./manage.py users password {user's email} {new password}