やったこと
- ローカル環境からLookerAPIを使ってSQLを流して結果を受け取る
背景
- データ分析をする際にいちいちcsvダウンロードするのはちょっとだるいので作業が生まれる前に消し去りたい
- SDKがあるならさらに楽ができるかも
用意するもの
- Python
- LookerSDK
準備
Looker Api SDK
公式説明
https://docs.looker.com/reference/api-and-integration/api-sdk
GitHub
https://github.com/looker-open-source/sdk-codegen/tree/master/python
とりあえずインストール
pip install looker_sdk
認証
### 環境変数設定
os.environ['LOOKERSDK_API_VERSION']='3.1'
os.environ['LOOKERSDK_BASE_URL']='https://xxxxxxxx.looker.com:19999'
os.environ['LOOKERSDK_CLIENT_ID']='xxxxxxxxxxxxxxxxxxxx'
os.environ['LOOKERSDK_CLIENT_SECRET']='xxxxxxxxxxxxxxxxxxxxxxxx'
### 認証
sdk = looker_sdk.init31()
my_user = sdk.me()
print('####################')
print(my_user["first_name"])
print('####################')
iniファイルを読み込むやり方もあるらしいけども
できた!SDKが認証情報を環境変数から読みとっってくれる模様。
ローカルからLooker経由でSQLを流して結果を取得するぞ!
どこから調べればいいか。。。
とりあえずリファレンスを眺めてみる。。。。と
おおおおおおっっっ!?APIのリファレンスでSQL Runnerっていうものがありますね。それっぽい!
どうやらBETA版みたいですね。(2020/12/23時点)
変わったら変わったでとりあえずGoGo!!
さてどうやっていくか
恐らく使えるモジュールはこんな感じ
リンク
- サンプルコードないので、ちょっと苦しい。
- リファレンスを見てみるとどうやら該当する部分の操作は以下のものであるようだ
- クエリを登録
- クエリの取得
- クエリの実行
-
おそらくキューに入れて実行する仕組みのようだ。キューは下記で確認できる
-
ネットで探してみる限りsdkからAPIのURLに該当するメソッドを持ってくるらしい。
- これはリファレンスの中に入っている。
- ただ引数はどうすればいいか
- SqlQueryCreateで作成するっぽい
- SqlQueryCreate
- model_name
- よくわからない。ただ、modelの文字列を入れたら動くようになった
- sql
- 説明割愛
- model_name
- SqlQueryCreate
- SqlQueryCreateで作成するっぽい
クエリの登録
from looker_sdk import methods31, models31
# APIの引数を作成
SQL = "select * from xxxxxxx limit 10"
query = models31.SqlQueryCreate( model_name="xxxxxxxx",sql="select * from public.xxxxx limit 10")
# クエリを実行
result = sdk.create_sql_query(body=query).slug
どうやら、looker_sdkの中にAPIのバージョンに対応したモジュールがあるらしい。
今回は3.1なのでそれに該当するものを選択
クエリの実行
sdk.run_sql_query(result,"csv",True)
-
run_sql_query
- 第一引数(必須)
- クエリを登録した時に取得できるクエリの文字列
- 実行するクエリを指定
- 第二引数(必須)
- 出力のファイル形式を指定
- CSV以外にも,jsonやtxtなどでも出力できるらしい
- 第三引数(任意)
- ダウンロード有無を指定
- デフォルトはfalseでダウンロード無し
- 戻り値
- ダウンロードしたときはバイナリで帰ってくる
- 第一引数(必須)
-
SQLを投げて空のものが帰ってきたときはここをチェックしてください。
- https://xxxx.looker.com/admin/queries
- キューに入れて実行のような仕組みっぽいのでログが見えます。
- API上からだとSQLがコケたと言おうことがわからなそうということ
バイナリで帰ってくるのでバイナリで保存してあげると使えるようになります
fw = open('result.csv', 'wb')
fw.write(sdk.run_sql_query(result,"csv",True))
fw.close()
おわりに
正直、LookerをローカルからSQLを実行して嬉しい人っていうのは割とすくないかもとおもってしまっているところはありました。
多くの人はダッシュボード見るし、欲しけりゃBigQueryをpandasでつなげばいいじゃん勢も出てきそうなので、今回調べたもののメリットの大部分はSDKの使い方の様な気がしてなりません。Lookerの資産を使いつつ、Looker上で扱うにはあまりにも複雑だったり頻繁に変わるようなクエリについてはこのようにSDKを経由してSQLで取得→分析を自動的に回す仕組みを構築することに意義があるものだと思います。
参考文献
認証key取得
- https://dev.classmethod.jp/articles/looker-api-get-data/
公式説明
- https://docs.looker.com/reference/api-and-integration/api-sdk
looker-open-source(github)
- https://github.com/looker-open-source/sdk-codegen
- https://github.com/looker-open-source/sdk-codegen/tree/master/python