- pre-amble
- 1. Shopify models の生成
- 2. semantic layer の設定
- 3. semantic layer の接続設定
- なんやかんやで BI は表示できた
- おまけ: Snowflake で readonly/select 権限をつける
pre-amble
PART 1 はこちら↓
前回は dbt Cloud にデータを乗せるところまでやって、今回は
- Fivetran の Shopify 用 dbt package を使う
- semantic layer の設定
- semantic layer の接続設定をして steep につなぐ
という作業があった。実は3番目が一生うまくいかなくていちばんキツかった。あと、今回やってみたと同じくらい「よーわからん」ポイントが多かった。
steep にした理由
... は特にないんだけど、 UI が白くてとっつきやすかったから、が一つかも? thoughtspot の mode とかもいいらしい。
あとは、後出しだけど classmethod さんが記事出してたのも心強かった。
1. Shopify models の生成
前回までで、 Snowflake に Shopify データがある・ dbt Cloud のアカウントを作ったという状態で、このやってみたのお題をもらった方から「Shopify x Fivetran は dbt パッケージがあるのでいいですよ〜」と教えてもらってたので、それを使うところから始まった。パッケージの GitHub はここ↓で、作成されるモデルの dbt docs も README からリンクが貼ってあって神。
https://github.com/fivetran/dbt_shopify
モデルを作ってくれる dbt package を使ったことがなかった + dbt Cloud もよくわからんところからはじめたので 、README を見てもイマイチよくわからなかったんだけど
- package.yml に追加
- dbt run を実行
すると、たしかに Snowflake 上にモデルが出来ててすっごい便利だった。
疑問
(1) models/ 以下に新しくできた Shopify の stg/int/mart モデルは増えてないけどいいんだよね...?
fivetran/shopify パッケージが model の定義を持ってるから、自分のコードには定義は追加されないってこと? といったん納得してみた。dbt docs の方には反映されてたのでよさそう
(2) project, database/schema がめちゃめちゃ分かれちゃったんだけど
project に関しては、Shopify だけで shopify_source
と shopify
でわかれちゃったし、Snowflake 側も
fivetran_data.shopify
schema 以下に source のテーブルpc_dbt_db
Database の中にdbt_sobacha
dbt_sobacha_shopify
dbt_sobacha_stg_shopify
schema の中に各 stg/int/mart モデル用のテーブル
という感じになって、これでいいんだっけ...? という気持ちになった。とはいえ、 fivetran/dbt の docs を見ると project は source とそれ以外で分かれているのでそういうものなのかも?
2. semantic layer の設定
このガイドの step 8 から進める感じにした。step 8 では、 orders と customers テーブルを作っていて、これを staging 層から自分で作るか、それとも fivetran/shopify パッケージが作ってくれた mart テーブルの上に作るかで迷ったんだけど、以外と order_date とか total を計算するのが大変そうだったので後者にした。
ガイドにある fct_orders
と dim_customers
のモデルを作ったあとは、ガイドの metrics ファイルをコピペした。
疑問というか
コピペして、だいたいは BI で表示するところまで行けるんだけど、 large_orders
measure に関してだけこういうエラーが出た。疲れてこれはトラシューしてない。たぶん Dimension('order_id__order_count_dim')
みたいなやつが怪しいと思うんだけど...
3. semantic layer の接続設定
とりまガイドの続きとクラメソさんの記事を読めばいいんだけど、なんかいろいろうまくいかなくて大変だった。
やらかし 1: クエリが "No active warehouse selected" になる
起こったことは、接続はうまくいって steep 上に metrics 一覧は出るんだけど、 metrics のグラフを表示しようとするとエラーメッセージが出る、っていう。エラー画面はこう↓
steep のエラーメッセージは普通に謎だけど、 Snowflake 側のクエリ実行履歴を見ると、
No active warehouse selected in the current session. Select an active warehouse with the 'use warehouse' command.
ということだった。ようは use warehouse hoge_warehouse
できてないよ、ってことっぽくて、SL の接続用につくった Snowflake user を確認すると、 default warehouse が設定されてなかった。
やらかし? 2: user の設定を変えても反映されない
ということで SL 用 user に default warehouse をつけたんだけど、引き続き同じエラーが出続けてガン萎えした。明確に解決してないんだけど、
- 別のユーザをつくる
- dbt Cloud で Service Token を発行しなおす
- Google Sheets でも試して同じエラーになることを確認 (i.e. steep 固有の問題でない)
あたりを試したら、時間経過のせいかとりあえず別のユーザで接続できるようになった。どっかでキャッシュしてるのかな...
なんやかんやで BI は表示できた
わーい。前のステップでバリ疲れたので、もう表示できただけで嬉しかった。
こういう↓感じで time grain を daily/monthly とかで切り替えられるし 28 days の moving average とかも使えるので、うまく導入できれば Spreadsheet でサグラダファミリアを作らなくてすみそう。
おまけ: Snowflake で readonly/select 権限をつける
User/Role を作るにあたって結局なんの権限をどのレイヤーにつければいいのか混乱したんだけど、ここ↓がわかりやすかった。
たとえば、 my_db の my_schema 以下にあるすべての table/view に権限をつけたい場合は
grant usage on database my_db to role hoge_role; grant usage on schema my_schema to role hoge_role; grant select on all tables in database my_db to role hoge_role; grant select on future tables in database my_db to role hoge_role; grant select on all views in database my_db to role hoge_role; grant select on future tables in database my_db to role hoge_role;
だと思う、試行錯誤して発行してたのであとで修正するかも。なんか、今回みたいな database も schema もいっぱいあるよ、ってときだとちょっとめんどくさいな... と思った。