Open18

dbt の description を COMETA に反映させるチャレンジ

ta93abeta93abe

COMETA に dbt の yml ファイルで定義した desciption の値を持ってくる。

ta93abeta93abe

COMETA の CSV インポート機能で以下のテンプレートが取得できる。データストアは Snowflake を使う。

  • テーブル基本メタデータ (snowflake-database-metadata-import)
  • スキーマ基本メタデータ (snowflake-schema-metadata-import)
  • テーブル基本メタデータ (snowflake-table-metadata-import)
  • カラム基本メタデータ (snowflake-column-metadata-import)
  • カラム参照 (snowflake-relationship-import)
ta93abeta93abe

catalog.json や manifest.json をゴニョゴニョするのはつらそうだったので
dbt の persist_docs を true にして Snowflake の COMMENT に反映させてそれを取得してみる。

ta93abeta93abe

テーブルレベル

select
    table_catalog as database,
    table_schema as schema,
    table_name as name,
    comment as description
from playground.information_schema.tables
where table_schema = 'PUBLIC_TEST';
DATABASE SCHEMA NAME DESCRIPTION
PLAYGROUND PUBLIC_TEST MY_SECOND_DBT_MODEL A starter dbt model
PLAYGROUND PUBLIC_TEST MY_FIRST_DBT_MODEL A starter dbt model

DDL

ta93abeta93abe

テーブル基本メタデータ (snowflake-table-metadata-import)

  • database_name
  • schema_name
  • table_name
  • logical_name
  • description

カラム名まで揃えた SQL

select
    table_catalog as "database_name",
    table_schema as "schema_name",
    table_name as "table_name",
    comment as "logical_name",
    comment as "description"
from playground.information_schema.tables
where table_schema = 'PUBLIC_TEST';

いったん logical_name と description は同じものを。

database_name schema_name table_name logical_name description
PLAYGROUND PUBLIC_TEST MY_SECOND_DBT_MODEL A starter dbt model A starter dbt model
PLAYGROUND PUBLIC_TEST MY_FIRST_DBT_MODEL A starter dbt model A starter dbt model
ta93abeta93abe

Snowsight から CSV でダウンロードして、COMETA > 管理・連携 > メタデータ管理 > メタデータインポートでデータストアを適切なものに、インポート対象は「テーブル基本メタデータ」に指定して「CSVをアップロード」でダウンロードした CSV をアップロードする。

ta93abeta93abe

今回はテストのため不思議な where 句を添えているけれど、本来は COMETA と連携している Snowflake のロール(COMETA_ROLE みたいなの)で実行すれば、where がいらない。

後できれいな SQL を作る。
Python のほうが書きやすい。

ta93abeta93abe

dbt sources の description を persist_docs で書き込めないので結局は json -> csv をやらないと完璧ではないかな。

ta93abeta93abe

dbt で管理しているのはテーブルレベルの description と カラムレベルの description なので、
その他は頑張れという認識。

  • テーブル基本メタデータ (snowflake-database-metadata-import)
  • スキーマ基本メタデータ (snowflake-schema-metadata-import)
  • カラム参照 (snowflake-relationship-import)

カラム参照は頑張ればできるのかな?

ta93abeta93abe

Python で書くとこんな感じ(テーブルレベル)

import snowflake.snowpark as snowpark
from snowflake.snowpark.functions import col
import pandas as pd
from functools import reduce

def main(session: snowpark.Session):
    data = []
    databases = ["SOURCE", "STAGING", "INTERMEDIATE", "MARTS"] # 自分でデータベースを選ぶ
    for database in databases:
        table = f"{database}.INFORMATION_SCHEMA.TABLES"
        table_df = session.table(table)[["TABLE_CATALOG", "TABLE_SCHEMA", "TABLE_NAME", "COMMENT"]].filter(col("TABLE_SCHEMA") != "INFORMATION_SCHEMA")
        df = table_df.with_column('"description"', table_df["COMMENT"])
        data.append(df)

    return reduce(snowpark.DataFrame.union, data).rename({
            col("TABLE_CATALOG"): '"database_name"',
            col("TABLE_SCHEMA"): '"schema_name"',
            col("TABLE_NAME"): '"table_name"',
            col("COMMENT"): '"logical_name"',
        })
ta93abeta93abe

Markdown も試す。

doc.md
{% docs test %}

# Iamque praecordiaque paratur hac haec cladibus

## Finierat timentia Phobetora visent pavens non feroxque

_Lorem_ markdownum lecta: iuvencos emeritis ima. Supremis quam quas _veteres_
annos tenet erat, inde distinxit modo limine **flammis**.

- hello
- world

### heading3

1. Madefactam ausus arsit tanges
2. Vulnere Tellus relinquam postquam exiguo
3. Incumbit ire faciem pariter suumque
4. Tuorum iam totis in non sed sceleri
5. Et est ipsi relinquar fortuna ignem lactentem
6. Peregrinum interea ille fecunda nunc serpens faciam

{% enddocs %}
schema.yml
version: 2

models:
  - name: my_first_dbt_model
    description: '{{ doc("test") }}'
    columns:
      - name: id
        description: "The primary key for this table"

DDL

ta93abeta93abe

このように設定するのもありかもしれない。

ta93abeta93abe

↑あくまでカラムレベルの設定で今までやってきたテーブルレベルでは設定できない。