
dbt Semantic Layerを作成するまでにあらゆるエラーを踏んだ話
こんにちは、dbt勉強中のikumiです。
dbtを勉強中ですが、dbt Semantic Layerを作りたい!!と思い立ち、初学者ながら取り組んでみました。
しかし色々なエラーを踏んだので、踏んだエラーと解消方法について備忘録的にメモしていきます。なお、取りあえず解消することを目指したので、なんでこれで解決するんだろう・・・。というのは今後の宿題ということにしてます。(勉強頑張ります!)
ちなみに、私のdbt学習状況は、Quickstart for dbt and Snowflakeを一周した程度で、初心者中の初心者となります。
環境
- プラン:dbt clout enterprise
- 接続先:snowflake
また、dbtのプロジェクトはQuickstartで作成したプロジェクトをそのまま使用しました。
dbt Semantic Layerの作成方法
dbt Semantic Layerの作成方法については、以下ブログを参考にしましたので、本記事では詳しい作成ステップについて解説しません。
上記のブログにも出てくる通り、コードについては以下のリポジトリに記載のあるコードをそのままコピペして手順を進めました。(これのせいで出てきたエラーもありますが・・)
それでは、出たエラーについて順番に記載していきます。
エラー1:Modelの参照エラー
一つ目に出たエラーは、「emantic_model.jaffle_shop.orders」が見つからないよ! というエラーです。
07:55:43 Encountered an error:
Compilation Error
Semantic_Model 'semantic_model.jaffle_shop.orders' (models/semantic_tableau.yml) depends on a node named 'orders' which was not found
- 今回、私はQuickstartの手順でそもそも
orders
というモデルを作成していないので、当然エラーになります。 - 前述のリポジトリで参考にしたコードでは、
semantic_models
の参照モデルがorders
になっていたので、QuickStartで作成した、存在するcustomers
に変更することでエラーを解消しました。
semantic_models:
## model: ref('orders') →エラーがでた時のコード
model: ref('customers') ## 修正
エラー2:Time Spineの設定エラー
2つ目は、セマンティックモデル作るなら、Time Spineを定義して! というエラー
07:58:58 Encountered an error:
Parsing Error
The semantic layer requires a time spine model with granularity DAY or smaller in the project, but none was found. Guidance on creating this model can be found on our docs site (https://docs.getdbt.com/docs/build/metricflow-time-spine).
- QuickStartを1回やったくらいなので、正直Time Spine?なんだそれ?状態です。
- Time Spineとは何か調べてもまだ理解しきれていないのですが、、まずは参考のリポジトリ通りに設定してみようと思い、以下のファイルを追加しました
metricflow_time_spine.sql ##作成ファイル名
with
days as (
--for BQ adapters use "DATE('01/01/2000','mm/dd/yyyy')"
{{ dbt_date.get_base_dates(n_dateparts=365*10, datepart="day") }}
),
cast_to_date as (
select
cast(date_day as date) as date_day,
date_trunc('quarter', date_day) as almost_fiscal_quarter
from days
)
select * from cast_to_date
エラー3:パッケージがインストールされていない
3つ目は、dbt_date
パッケージがインストールされてない! というエラーです
08:19:25 Compilation Error in model metricflow_time_spine (models/metricflow_time_spine.sql)
'dbt_date' is undefined. This can happen when calling a macro that does not exist. Check for typos and/or install package dependencies with "dbt deps".
- プレーンなプロジェクトでしたので、パッケージも入っていません。(そりゃそうですよね)
- 以下コードを記述したファイルを追加し、
dbt deps
コマンドでパッケージを反映させました
package.yml ##ファイル名
packages:
- name: dbt_date
package: calogica/dbt_date
version: 0.10.1
エラー4:dbt_dateの変数エラー
4つ目は、dbt_dateを実行するためのTimezoneが設定されていない !というエラー
08:26:23 Failure in model metricflow_time_spine (models/metricflow_time_spine.sql)
08:26:23 Compilation Error in model metricflow_time_spine (models/metricflow_time_spine.sql)
Required var 'dbt_date:time_zone' not found in config:
Vars supplied to metricflow_time_spine = {}
- どうやらdbt_dateにはTimezoneを設定する必要があるそうです
- 設定ファイルに以下のコードを追記しました
vars:
dbt_date:time_zone: 'Asia/Tokyo'
こちらで私が遭遇したエラーは以上で、すべて反映させた後、無事dbt build
コマンドを成功させることができました🎉
さいごに
初めてのツールを触るときはエラーばかりで心も折れることが多いかと思いますので、本ブログがどなたかの参考になれば幸いです!