0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Snowflake で dbt の dbt-codegen パッケージを利用する際に codegen の generate_source および generate_model_yaml にてデータ型の桁数を出力する方法

0
Posted at

概要

本記事では、Snowflake で dbt の dbt-codegen パッケージを利用する際に、codegen の generate_source および generate_model_yaml で YAML を出力したとき、varcharnumber などのデータ型について桁数(長さ、精度・スケール)を含めて取得する方法を紹介します。

generate_source コマンドで YAML を出力すると、デフォルトの挙動では varcharnumber といった型名のみが出力され、桁数が出力されませんでした。

image.png

文字や数値の桁数も YAML に出力したいと考えて調査したところ、該当マクロを上書きすることで実現できました。

image.png

対応方法

変更前のマクロ

dbt-codegen の実装を確認すると、generate_source では下記の行でデータ型を出力しています。

                {% do sources_yaml.append('            data_type: ' ~ codegen.data_type_format_source(column)) %}

image.png

出所: dbt-codegen/macros/generate_source.sql at 0.14.0 · dbt-labs/dbt-codegen

また、generate_model_yaml では下記の行でデータ型を出力しています。

        {% do model_yaml.append('        data_type: ' ~ codegen.data_type_format_model(column)) %}

image.png

出所: dbt-codegen/macros/generate_model_yaml.sql at db1b3a968318947dedaa91b489422058697f2bb7 · dbt-labs/dbt-codegen

上記のとおり、いずれも codegen.data_type_format_source(column) および codegen.data_type_format_model(column) によって型表現を整形した結果を出力しています。この整形処理を Snowflake 向けに差し替えることで、桁数を含んだ型表現を出力できます。

上書きマクロ

macros 配下に任意の名称(例:codegen_overrides.sql)のファイルを作成して、下記のコードを記述します。

{% macro snowflake__data_type_format_source(column) %}
  {{ return(column.data_type | lower) }}
{% endmacro %}

{% macro snowflake__data_type_format_model(column) %}
  {{ return(column.data_type | lower) }}
{% endmacro %}

image.png

この上書きでは、Snowflake アダプタが返す column.data_type をそのまま(小文字化のみ)採用し、number(38,0)character varying(25) のように、桁数を含む型表現が出力されるようにしています。

動作確認

マクロの上書き前(デフォルト)の動作

ソースの YAML を出力すると桁数が出力されません。

dbt --quiet run-operation generate_source --args '{
  "database_name": "SNOWFLAKE_SAMPLE_DATA",
  "schema_name": "TPCH_SF1",
  "name": "tpch_sf1",
  "table_names": ["CUSTOMER"],
  "include_database": true,
  "include_schema": true,
  "generate_columns": true,
  "include_data_types": true,
  "include_descriptions": true
}'
version: 2

sources:
  - name: tpch_sf1
    description: ""
    database: snowflake_sample_data
    schema: tpch_sf1
    tables:
      - name: customer
        description: ""
        columns:
          - name: c_custkey
            data_type: number
            description: ""
          - name: c_name
            data_type: varchar
            description: ""
          - name: c_address
            data_type: varchar
            description: ""
          - name: c_nationkey
            data_type: number
            description: ""
          - name: c_phone
            data_type: varchar
            description: ""
          - name: c_acctbal
            data_type: number
            description: ""
          - name: c_mktsegment
            data_type: varchar
            description: ""
          - name: c_comment
            data_type: varchar
            description: ""

image.png

モデルの YAML も同様です。

dbt --quiet run-operation generate_model_yaml --args '{
  "model_names": ["table_01"],
  "include_data_types": true,
  "upstream_descriptions": false
}' 
version: 2

models:
  - name: table_01
    description: ""
    columns:
      - name: c_custkey
        data_type: number
        description: ""

      - name: c_name
        data_type: varchar
        description: ""

      - name: c_address
        data_type: varchar
        description: ""

      - name: c_nationkey
        data_type: number
        description: ""

      - name: c_phone
        data_type: varchar
        description: ""

      - name: c_acctbal
        data_type: number
        description: ""

      - name: c_mktsegment
        data_type: varchar
        description: ""

      - name: c_comment
        data_type: varchar
        description: ""

マクロの置換後の動作

マクロを上書き後、ソースの YAML を出力するコマンドを実行すると、データ型の桁数を確認できました。

version: 2

sources:
  - name: tpch_sf1
    description: ""
    database: snowflake_sample_data
    schema: tpch_sf1
    tables:
      - name: customer
        description: ""
        columns:
          - name: c_custkey
            data_type: number(38,0)
            description: ""
          - name: c_name
            data_type: character varying(25)
            description: ""
          - name: c_address
            data_type: character varying(40)
            description: ""
          - name: c_nationkey
            data_type: number(38,0)
            description: ""
          - name: c_phone
            data_type: character varying(15)
            description: ""
          - name: c_acctbal
            data_type: number(12,2)
            description: ""
          - name: c_mktsegment
            data_type: character varying(10)
            description: ""
          - name: c_comment
            data_type: character varying(117)
            description: ""

image.png

モデルの YAML を出力するコマンドを実行すると、データ型の桁数を確認できました。

version: 2

models:
  - name: table_01
    description: ""
    columns:
      - name: c_custkey
        data_type: number(38,0)
        description: ""

      - name: c_name
        data_type: character varying(25)
        description: ""

      - name: c_address
        data_type: character varying(40)
        description: ""

      - name: c_nationkey
        data_type: number(38,0)
        description: ""

      - name: c_phone
        data_type: character varying(15)
        description: ""

      - name: c_acctbal
        data_type: number(12,2)
        description: ""

      - name: c_mktsegment
        data_type: character varying(10)
        description: ""

      - name: c_comment
        data_type: character varying(117)
        description: ""

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?