Edited at

Re:Dashでpythonデータソースを使ってクエリ結果をごにょごにょしたい

More than 1 year has passed since last update.


はじめに

Re:Dashは画面を作りたくないエンジニアにとって、

クエリを組むだけでそれっぽい画面やグラフ化なんかもできてとっても便利。

でもクエリを作るだけじゃなくて、もう少しデータをごにょごにょしたいことありませんか?

もっというと、異なるデータソースのクエリ結果を結合させたいって思う事ありませんか??

Re:Dashには「pythonデータソース」なるものが用意されていて、

ちょっと設定をすればpythonでデータをごにょごにょできるようになっちゃいます。

これがとっても便利だったので、今回は設定の仕方から主要な機能・使い方の紹介をさせて頂きます。


pythonデータソースを使用できるようにする

デフォルトではpythonデータソースは使用できないようになっています。

下記設定を追加すればデータソースからpythonが指定できるようになります。


/opt/redash/.env の修正


/opt/redash/.env

export REDASH_ADDITIONAL_QUERY_RUNNERS=redash.query_runner.python



設定を反映させる


sudo supervisorctl restart redash_server



新しいデータソースの追加

Data Sources から + New Data Sourcesをクリック。

TypePythonが選択できるようになっているので選択し、Nameに適当な名前を入れてsaveすると

クエリ作成時にPythonデータソースが選択できるようになります。

redash_datasource.png

redash_datasource_select.png


ごにょごにょしたいデータを用意する

予めごにょごにょする前のデータを準備しておきます。

詳しくはこの記事では割愛させて頂きますが、定期実行を設定して必要なデータのみを必要なタイミングで取得・キャッシュさせておきましょう。

今回は「異なるデータソース間の数値を合算させて表示させる」という目的を想定して準備してみます。

簡単なクエリ結果を下記のように2つ用意。


データ①

作成したクエリのクエリIDをメモしておく。今回このクエリは クエリID=76 とする

redash_data1.png


データ②

作成したクエリのクエリIDをメモしておく。今回このクエリは クエリID=77 とする

redash_data2.png


データをごにょごにょしてみる

どんな想定かはさておきw

2つの異なるデータソースから取得したクエリ結果から

同じIDのCOUNTを合算させて表示させるようごにょごにょしてみます。


ざっくり書いてみたコード全容

APIを使用してクエリ結果を取得し、pythonで行いたい処理を書いたらAPIで結果をセットしてあげればOK

※APIについては下記参照

※下記は適当なコードですがforやif文など普通に使えるよ!という例で。。

※get_query_resultで取得したクエリ結果は rows['rows'][行数][カラム名]=値 の形で取得されます。

# 指定したクエリIDのクエリ結果を取得する

queryResults1 = get_query_result(76)
queryResults2 = get_query_result(77)

result = {}
for rows1 in queryResults1['rows']:
for rows2 in queryResults2['rows']:
if rows1['id'] == rows2['id']:
# 行データを追加する
add_result_row(result, {
'id' :rows1['id'],
'count' :rows1['count'] + rows2['count']
})
break

# カラム名を指定する
add_result_column(result, 'id', '', 'integer')
add_result_column(result, 'count', '', 'integer')

redash_result.png


主要なAPI

API
内容

get_query_result(queryId)
指定したクエリIDのクエリ結果を取得する
get_query_result(1)

add_result_row(result, values)
行データを追加する
add_result_row(result, {'id':rows['id'],'count':rows['count']})

add_result_column(result, columnName, friendlyName, columnType)
カラム名を指定する
add_result_column(result, 'id', '', 'integer')

execute_query(dataSourceName, query)
queryをdataSourceName上で実行し結果を取得する
execute_query('testDataSource', 'select * FROM test WHERE id = 1')

詳しくは実際のRe:dash内部のソースを読んでみてください


モジュールを使いたい場合

Data Sourceのsetting画面からモジュールを追加することで使用できるようになります。

複数追加したい場合はカンマ区切りで追加します。

saveをしたらコード上でimportしてあげるだけで使用できるようになります。

redash_module.png


さいごに

普通にpythonでコードが書けてしまうので、少し複雑な処理もさせることができ

利用の幅が広がるのではないかと思います。なにより画面を作らなくていいという時点で素晴らしい。。

是非利用してみてください!


関連記事

Re:Dashのアップグレードをしたい

Re:Dashで便利な小技まとめ