やってみた: Shopify → Fivetran → Snowflake → dbt Cloud → steep PART 2

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_sourceshopify でわかれちゃったし、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_ordersdim_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 もいっぱいあるよ、ってときだとちょっとめんどくさいな... と思った。