Snowflakeのテーブルをdbt Coreを使って移送

はじめに

この記事は、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 HubAbout 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 に行く必要があります…。

と書かれているので、それに従い、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 Hubmacro-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に書いてある)の kageyu2schema(query1.sqlの1行目)に、query1テーブル(modelsにあるファイル名)が作られ、その内容をsource('SANDBOX_kageyu', 'dbt_test_source')から生成するという意味になります。source('SANDBOX_kageyu', 'dbt_test_source'の部分はdbtが探してくれますが、まだ存在しないので用意する必要があります。

そこで、kageyu_source.ymlをmodelsの中に置き、SANDBOX_kageyudbt_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というレコードが入っていました。

めでたしめでたし。

© 2019- estie, inc.