Appearance
カタログアノテーション
概要
- Codatumでは、コネクション設定で同期対象として指定されたテーブルのメタデータ(カラム定義等)を定期的に取得して、カタログを構築します
- カタログ機能では、コネクションから自動的に取得できる情報に加えて、ユーザが手動で付与するアノテーション情報(説明・タグ)も管理できます
- カタログアノテーションファイル(
.cann.yaml)は、これらのアノテーション情報をローカルファイルとして管理し、CLIを使ってサーバと同期するために利用されるファイル形式です- カタログアノテーションファイルの生成や同期については、
cdm catalog annotationの各コマンドで行います- 各コマンドの利用方法は 分析コンテキストの整備 を、テーブル・カラムに何を書くかの設計の考え方は 分析コンテキストの設計 を参照してください
- ファイルは通常の YAML 形式のファイルで、 git 等でバージョン管理することを想定しています
- テーブル単位・カラム単位の説明(
description)とタグ(tags)をアノテーション情報として管理できます
- カタログアノテーションファイルの生成や同期については、
- アノテーションが未設定のテーブル・カラムでは、DWH から取得された説明・タグ(DWH由来の値)がカタログ上に表示されます。アノテーションはこれらを上書きするものとして機能します
カタログの構造
- カタログ内のテーブル情報は、ワークスペース毎に
schemaUriとtableIdの組み合わせで管理されています- コネクション単位ではなく、DWH 上のスキーマ・テーブルの実体単位で管理されます
- 例えば BigQuery なら project / dataset / table 、Snowflake なら account / database / schema / table が一致すれば、同一の実体として扱われます
schemaUriは、DWH 上のスキーマを一意に識別するための識別子です- スキーマ名のみを表す
schemaIdと異なり、project / account 等を含めてスキーマを一意に特定します(例:bq:my-project/analytics) - 値は
cdm catalog list-schemasで確認できます
- スキーマ名のみを表す
tableIdは、テーブル名で、スキーマ内でテーブルを一意に識別する ID として利用されます
ファイル定義
- カタログアノテーションファイル(
.cann.yaml)は、有効なYAML形式のファイルで、次のオブジェクト型で表現します
ts
type CatalogAnnotationFile = {
schemaUri: string; // 例 bq:bigquery-public-data/thelook_ecommerce
manages: 'listed-tables' | 'all-tables';
tables: TableAnnotation[];
};schemaUriは、このファイルが対象とするスキーマの識別子です- 1ファイルで管理できる
schemaUriは1つのみで、schemaUriごとにファイルを生成します
- 1ファイルで管理できる
managesは、このファイルがschemaUriの全テーブルを管理(all-tables)するか、一部のテーブルのみを管理(listed-tables)するかを宣言しますtablesは、アノテーションを付与するテーブルの配列です- ローカルでのファイル名・ディレクトリ構造は自由です
- サーバとの同期は、ファイル内の
schemaUriとtableIdで対象を特定します
- サーバとの同期は、ファイル内の
テーブルアノテーション
tables配列の各要素は、次のオブジェクト型で表現します
ts
type TableAnnotation =
| {
tableId: string;
description?: string; // 最大 1024 文字
tags?: string[]; // 最大 16 タグ
columns?: ColumnAnnotation[];
}
| {
tableId: string;
delete: true; // アノテーションの削除を宣言(manages: listed-tables のみ)
};tableIdはテーブル名で、スキーマ内でテーブルを一意に識別する ID として利用されますdescriptionにはアノテーションとして付与するテーブルの説明を指定しますtagsにはアノテーションとして付与するテーブルのタグ名の配列を指定します- タグはIDではなくタグ名で記述します。指定可能なタグ名は
cdm catalog tag listで確認できます - テーブルに付与できるのはテーブル用(
type:table)のタグのみです
- タグはIDではなくタグ名で記述します。指定可能なタグ名は
descriptionとtagsの反映のされ方はサーバとの同期を参照してくださいcolumnsはカラム単位のアノテーションの配列ですdelete: trueは、このテーブルのアノテーションをすべて削除することを宣言しますdelete: trueを指定しない各テーブルは、description/tags/columnsのいずれかのフィールドを持つ必要があります(正規化)columnsのみの場合は、空配列は許容されず、有効なアノテーションを持つカラムを含む必要があります
カラムアノテーション
columns配列の各要素は、次のオブジェクト型で表現します
ts
type ColumnAnnotation = {
name: string;
description?: string; // 最大 1024 文字
tags?: string[]; // 最大 16 タグ
};nameにはカラム名を指定しますitems.item_idのようにドットを含むカラム名も指定できます
descriptionにはアノテーションとして付与するカラムの説明を指定しますtagsにはアノテーションとして付与するカラムのタグ名の配列を指定します- タグはIDではなくタグ名で記述します。指定可能なタグ名は
cdm catalog tag listで確認できます - カラムに付与できるのはカラム用(
type:column)のタグのみです
- タグはIDではなくタグ名で記述します。指定可能なタグ名は
descriptionとtagsの反映のされ方はサーバとの同期を参照してください- 各カラムは、
descriptionまたはtagsのいずれかのフィールドを持つ必要があります(正規化)
記述例
yaml
schemaUri: bq:my-project/analytics
manages: listed-tables
tables:
- tableId: orders
description: 注文トランザクション
tags: [core, daily_batch]
columns:
- name: items.item_id
description: 商品ID
tags: [foreign_key]
- name: amount
description: 税込金額
tags: []
- tableId: users
description: ユーザーマスタ
tags: [core]
- tableId: legacy_orders
delete: true正規化
- ファイルには、有効なアノテーションを持つテーブル・カラムのみを記載します
- 「有効なアノテーションを持つ」とは、
descriptionまたはtagsのいずれかのフィールドが定義されていることを指します - テーブルの場合は、
columnsに有効なアノテーションを持つカラムがあれば、有効なアノテーションを持つとみなします - フィールドの値が
""や[]であっても、それは「明示的に空を指定した」アノテーションの定義とみなします manages: listed-tablesではdelete: trueを持つテーブルは、有効な削除宣言を持つ行として扱います
- 「有効なアノテーションを持つ」とは、
- 管理対象のテーブルがない、もしくは、アノテーションを持つテーブルが1つもない状態の、
tables: []も有効なファイルとして扱われます - 有効なアノテーションも
delete: trueも持たないテーブル・カラムは、cdm catalog annotation validateでエラーになりますcdm catalog annotation formatで自動的に削除されます
- 新しくアノテーションを付与するテーブルの発見には
cdm catalog annotation untrackedを、そのカラムの追記にはcdm catalog annotation scaffoldを利用します
DWH由来の値との関係
- カタログには、アノテーションとは別に、DWH から自動的に取得される DWH由来の値 が存在します
descriptionは DWH 上のテーブル・カラムのコメント(COMMENT ON等)を、tagsは DWH 上のスキーマ情報(カラムのNOT NULL制約など)を、それぞれソースとします- 取得できる値の種類は DWH の種別によって異なり、今後拡張される可能性があります
- カタログ上の表示は、
description/tagsのフィールド単位で決定されます- アノテーションが設定されている場合: アノテーションの値を表示
- アノテーションが未設定の場合: DWH由来の値を表示(なければ空)
- 明示的な空(
description: ""/tags: [])は未設定とは区別され、DWH由来の値にフォールバックせず空を表示します。DWH由来の値を隠したい場合に利用します
- アノテーションを未設定のままにすると、DWH側の値の変更に自動追従します。そのため DWH由来の値は
.cann.yamlに取り込まれず、pull でもファイルに書き込まれません
サーバとの同期
カタログアノテーションファイルは、pull と push でサーバ上のカタログと同期します。同期の挙動は pull / push と テーブル / カラム で異なるため、以下に分けて説明します。
pull(サーバ → ファイル)
pull は、サーバ上のカタログの最新のアノテーションをファイルに取り込みます。各テーブルがどう扱われるかは、 manages の設定により異なります。
all-tables | listed-tables | |
|---|---|---|
| ファイルに記載のあるテーブル | サーバの内容で更新 | サーバの内容で更新 |
| ファイルに記載のないテーブル | ファイルに追記 | 取得しない |
- サーバ上でアノテーションが削除されている場合は、
managesの設定とは関係なくファイルからも削除されますmanages: listed-tablesでdelete: trueを push したテーブルは、push 後はサーバ上でアノテーション未設定になるため、その後のpullでファイルから削除されます
- テーブル内のカラムは、
managesの設定とは関係なく、サーバ上にアノテーションがあればファイルに反映し、サーバ上から削除されていればファイルからも削除します
push(ファイル → サーバ)
push は、ファイルの内容をサーバ上のカタログに反映します。ファイルに記載のないものをどう扱うかが、manages とテーブル / カラムで異なります。
テーブル
manages によって、ファイルに未記載のテーブルの扱いが異なります。
manages: all-tables: ファイルの記載をスキーマ全体のあるべき状態とみなします。ファイルに未記載のテーブルのアノテーションがサーバ上に存在する場合、そのアノテーションは削除されます。テーブルのアノテーションを削除するには、ファイルからそのテーブルの記載を削除します。manages: listed-tables: ファイルに記載されたテーブルのみを対象とし、ファイルに未記載のテーブルは管理対象外として更新も削除もしません。テーブルのアノテーションを削除するには、記載を残したままdelete: trueを指定します(記載を削除しても、そのテーブルは管理対象外になるだけで、サーバ上のアノテーションは削除されません)。
all-tables | listed-tables | |
|---|---|---|
| ファイルに記載のあるテーブル | ファイルの内容で更新 | ファイルの内容で更新 |
ファイルに記載のあるテーブル(delete: true) | (利用不可) | 削除 |
| ファイルに記載のないテーブル | 削除 | 更新しない |
カラム
ファイルに記載されたテーブルについては、ファイルの内容を「あるべき状態」としてサーバに反映します。サーバ側の既存のアノテーションは、ファイルの記載内容で全面的に上書きされます。ファイルに書いていない説明・タグやカラムのアノテーションは削除されます。
一部だけを更新する(サーバ上の値を残したまま一部を変える)ことはできません。既存の状態を保ったまま編集するには、必ず編集前に pull でサーバの最新状態をファイルに取り込んでください。
| サーバにアノテーションあり | サーバにアノテーションなし | |
|---|---|---|
| ファイルに記載のあるカラム | ファイルの内容で上書き | ファイルの内容で新規作成 |
| ファイルに記載のないカラム | 削除 | 変化なし |
管理のパターン
スキーマ内のテーブルをどのように管理するかは、ユースケースに応じて以下のようなパターンがあります。
1ファイルで管理する
manages: all-tables を指定して、スキーマ内の全テーブルのアノテーションを1つのファイルで管理します。dump で --table を指定せずにファイルを生成すると、このパターンになります。
pull を実行すると新規にアノテーションされたテーブルも自動でファイルに追記されるため、1ファイルでスキーマ内の全テーブルのアノテーションを管理する運用ができます。テーブルのアノテーションを削除する場合は、そのテーブルの記載をファイルから削除します(push で削除が反映されます)。
分割して管理する
テーブル数が多く1ファイルでの管理が困難な場合や、ライフサイクルの異なるテーブルのアノテーションを別々に管理したい場合などは、manages: listed-tables のファイルを複数用意して管理することもできます。
その場合、テーブルの重複や漏れを防ぐために、次のような手順で運用します。
dumpで--tableを指定せずにファイルを生成します- 生成したファイルを
manages: listed-tablesに変更して、分割数に合わせてコピーします - テーブルの記載が重複しないように、コピーしたファイルから不要なテーブルを削除します
validateを利用してファイル間でのテーブルの重複がないかを検査できます
- 分割後に追加されたテーブルの検出には
untrackedを利用します。その際は分割された全ファイルを同時に指定します(一部のファイルだけを指定すると、他のファイルに記載済みのテーブルも未記載として検出されます) - テーブルのアノテーションを削除する場合は、記載を残したまま
delete: trueを指定します(記載自体を削除すると管理対象外になるだけで、サーバ上のアノテーションは残ります)
特定のテーブルだけを管理する
スキーマの一部のテーブルだけを管理し、それ以外のテーブルは管理しない場合は、dump の --table で対象テーブルを絞り込んでファイル生成します。(生成されるファイルは manages: listed-tables になります)