はじめに
この記事は、Snowflakeのテーブルをただそのままdbtで移送できるようになるだけの記事です。色んな工夫をちりばめた天才達の記事を読む前に、Hello World!的なとりあえず動くものが欲しかった私に送る記事です。
環境はM3 Macです。Snowflakeは会社が契約してくれていて、普段からクエリをたくさん書いています。
テーブルの作成
dbtで移送をしたいので、移送元のテーブルを作ります。スキーマは元からあったものを使いました。
create or replace TABLE SANDBOX.kageyu.DBT_TEST_SOURCE ( ID NUMBER(38,0) DEFAULT SANDBOX.kageyu.SEQ1.NEXTVAL, NAME VARCHAR(255), AGE NUMBER(38,0) );
空のテーブルだと移送できたか確認しづらいので、データを挿入します。
insert into SANDBOX.kageyu.DBT_TEST_SOURCE values (1, 'one', 20);
dbtのインストール
どうにかして dbt Developer Hub に辿り着きます。実はここに割と手間取りました。
左上にあるdocsを押してWhat is dbt? | dbt Developer Hub やAbout dbt setup | dbt Developer Hubに進みます。今回はローカルで動かすため、dbt Coreが対象です。
If you need a more detailed first-time setup guide for specific data platforms, read our quickstart guides.
と書いてありますがSnowflakeのガイドはCloudのものしかないので諦めます。About dbt Core setup | dbt Developer Hub を読み進めると本文には
This section of our docs will guide you through various settings to get started:
と書いてありますが、目次にあるAbout dbt Core and installation | dbt Developer Hub に行く必要があります…。
- Use pip to install dbt (recommended)
と書かれているので、それに従い、Install with pip | dbt Developer Hub に進みます。
python -m venv dbt-env
これはdbt-envという名の仮想環境を作るコマンドです。実行します。
source dbt-env/bin/activate
これはdbt-envディレクトリ内のactivateプログラムを実行するコマンドです。実行します。
ここで dbt-env
ディレクトリが作られており、<PATH_TO_VIRTUAL_ENV_CONFIG>
でもあります。
(Create an aliasの章は、別のターミナルで行いたいときの話なので省略)
さらに読み進めると、 「Once you decide which adapter you're using, you can install using the command line. Beginning in v1.8, installing an adapter does not automatically install dbt-core.」と書かれています。とりあえず
python -m pip install dbt-core
を実行します。
Install with pip | dbt Developer Hub によれば、dbt --version
でバージョンを確認できそうなので実行したところ、
Core: - installed: 1.8.1 - latest: 1.8.1 - Up to date! Plugins:
と出たため大丈夫でした。ちなみに
python -m pip install dbt-ADAPTER_NAME
とありますが、ADAPTER_NAMEがわかりませんでした。Google検索したところ、 A Quick Guide to Implementing Snowflake dbt Integration | Hevo に
python -m pip install dbt-core dbt-snowflake
と書いてあったためこれを使ってみます。(のちにAbout dbt Core data platform connections | dbt Developer Hub にも書いてあることが判明します)(これは実質 pip install dbt-core dbt-snowflake
です)
dbt --version
を実行したところ、
Core: - installed: 1.8.1 - latest: 1.8.1 - Up to date! Plugins: - snowflake: 1.8.2 - Up to date!
と出力され、プラグインも正しくインストールされたようです。
dbtの移送プログラムを作成
Connection profiles | dbt Developer Hub を参考に、dbt_project.ymlを作成します。
name: 'kageyu' profile: 'kageyu_profile' # 自由につけて良いプロファイル名 # model-paths: ['models'] # models以外のディレクトリ名にmodelを置く場合は、この行を適宜変更 # macro-paths: ['macros'] # macros以外のディレクトリ名にmacroを置く場合は、この行を適宜変更 models: kageyu: materialized: table # すべてのスキーマに対して、テーブルにしたいときはこの行を追加
ドキュメントでは下の方が省略されており分かりにくい…と思いながら書きました。model-paths | dbt Developer Hub やmacro-paths | dbt Developer Hub に書いてあるように、modelsやmacrosがデフォルトです。Materializations | dbt Developer Hub に書いてあるように、materialized: tableやmaterialized: incrementalとしないとviewが作成されます。
Connection profiles | dbt Developer Hub を参考にprofiles.ymlを作成します。
kageyu_profile: # dbt_project.ymlで書いたプロファイル名 target: dev # devじゃなくてもいいが、devがお作法 outputs: dev: type: snowflake account: {{aa00000.ap-northeast-1.awsみたいなurl}} user: {{USER_NAME}} password: {{ここは秘密なのでドキュメントには書けない}} role: {{実行したいrole}} database: SANDBOX warehouse: COMPUTE_WH schema: kageyu threads: 1 client_session_keep_alive: False query_tag: DBT_TEST_KAGEYU
いわゆるクエリはdbt_project.ymlのmodel-pathsに書かれたパスに置きますが、デフォルトはmodelsなのでそこに置きます。同様にmacroはmacrosに置きます。
models
kageyu2というschemaのquery1テーブルに移送します。modelsディレクトリにquery1.sqlを作り、下記の様に書きます。
{{config(schema='kageyu2')}} select * from {{source('SANDBOX_kageyu', 'dbt_test_source')}}
こう書くことで、SANDBOX
(profiles.ymlに書いてある)の kageyu2
schema(query1.sqlの1行目)に、query1テーブル(modelsにあるファイル名)が作られ、その内容をsource('SANDBOX_kageyu', 'dbt_test_source')
から生成するという意味になります。source('SANDBOX_kageyu', 'dbt_test_source'
の部分はdbtが探してくれますが、まだ存在しないので用意する必要があります。
そこで、kageyu_source.ymlをmodelsの中に置き、SANDBOX_kageyu
のdbt_test_source
を書きます。これで、SANDBOXデータベースのkageyuスキーマにあるdbt_test_sourceテーブルだと教えてあげられます。
sources: - name: SANDBOX_kageyu database: "SANDBOX" schema: "kageyu" tables: - name: dbt_test_source
実行
dbt run
を実行します
SANDBOX.kageyu2.QUERY1テーブルが作成され、その中には1, ‘one’, 20というレコードが入っていました。
めでたしめでたし。