Snowflakeでお手製データカタログを作成する方法3（semantic-model-generatorのYAMLファイルを活用したデータカタログ自動生成）

## はじめに

前回の記事では，semantic-model-generatorを使用してセマンティックモデルのYAMLファイルを生成する方法について紹介した．今回は，そのYAMLファイルを入力として活用し，より実用的なデータカタログを自動生成する改良版について解説する．

## 改良版の特徴

### 主な改善点

1. **YAMLファイルの直接活用**: semantic-model-generatorで生成されたYAMLファイルを直接入力として使用
2. **設定の柔軟性向上**: 環境に応じた設定変更
3. **ローカル実行対応**: 閉域でのSnowflake環境で実行可能

## 実装方法

### 1. 環境設定

まず，プログラムの設定部分を環境に合わせて変更する必要がある．

```python
# 設定: 出力先データベース、スキーマ、テーブル名を指定
OUTPUT_DATABASE = "OUTPUT_DATABASE" #環境に合わせて書き換え
OUTPUT_SCHEMA = "OUTPUT_SCHEMA"     #環境に合わせて書き換え
OUTPUT_TABLE = "OUTPUT_TABLE"       #環境に合わせて書き換え

# ステージ情報の設定
SOURCE_DATABASE = "SOURCE_DATABASE"  #環境に合わせて書き換え
SOURCE_SCHEMA = "SOURCE_SCHEMA"      #環境に合わせて書き換え
SOURCE_STAGE = "SOURCE_STAGE"        #環境に合わせて書き換え
SOURCE_FILE = "XXXX.yaml"            #環境に合わせて書き換え
```

これらの設定値は，semantic-model-generatorの環境構築時に作成したSnowflake環境と対応している．具体的には，[create_snowflake_objects_local.sql](https://github.com/mshdtksk/sfguide-getting-started-with-cortex-analyst-main-local/blob/main/create_snowflake_objects_local.sql)で定義したデータベース，スキーマ，ステージ情報と一致させる必要がある．

例えば，create_snowflake_objects_local.sqlで以下のように定義している場合：
```sql
-- データベースとスキーマの作成例
CREATE DATABASE IF NOT EXISTS CORTEX_ANALYST_LOCAL;
CREATE SCHEMA IF NOT EXISTS CORTEX_ANALYST_LOCAL.cortex_analyst;

-- ステージの作成例
CREATE STAGE IF NOT EXISTS CORTEX_ANALYST_LOCAL.cortex_analyst.raw_data;
```

対応するPython設定は以下のようになる：
```python
SOURCE_DATABASE = "CORTEX_ANALYST_LOCAL"
SOURCE_SCHEMA = "cortex_analyst"
SOURCE_STAGE = "raw_data"
SOURCE_FILE = "semantic_model.yaml"  # アップロードしたYAMLファイル名
```

### 2. YAMLファイルの準備

semantic-model-generatorで生成されたYAMLファイルを，指定したSnowflakeステージにアップロードする．

### 3. プログラムの実行

改良版プログラムでは，以下の流れでデータカタログを生成する：

#### ステップ1: YAMLファイルの読み込み
```python
def load_yaml_from_stage():
    """ステージからYAMLファイルを読み込み"""
    query = f"""
    SELECT parse_json($1) as yaml_content
    FROM @{SOURCE_DATABASE}.{SOURCE_SCHEMA}.{SOURCE_STAGE}/{SOURCE_FILE}
    """
    return session.sql(query).collect()
```

#### ステップ2: メタデータの解析
```python
def parse_semantic_model(yaml_content):
    """セマンティックモデルのYAMLを解析してメタデータを抽出"""
    models = []
    for model in yaml_content.get('semantic_models', []):
        model_info = {
            'model_name': model.get('name'),
            'description': model.get('description', ''),
            'entities': model.get('entities', []),
            'dimensions': model.get('dimensions', []),
            'measures': model.get('measures', [])
        }
        models.append(model_info)
    return models
```

#### ステップ3: データカタログテーブルの生成
```python
def create_catalog_table(catalog_data):
    """解析したメタデータからカタログテーブルを作成"""
    df = pd.DataFrame(catalog_data)
    
    # Snowflakeテーブルとして保存
    session.write_pandas(
        df, 
        table_name=OUTPUT_TABLE,
        database=OUTPUT_DATABASE,
        schema=OUTPUT_SCHEMA,
        auto_create_table=True,
        overwrite=True
    )
```

## 出力結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880471/57447388-1ee9-4e01-93f2-48f1e5a5e1e7.png)


## まとめ

semantic-model-generatorのYAMLファイルを活用した改良版データカタログ生成について紹介した．今回紹介した改良版システムを活用することで，閉域環境においても，より効率的なデータ管理とガバナンスの実現が期待できる．

## 参考資料

- [GitHub Repository](https://github.com/mshdtksk/semantic-model-generator-to-datacatalog-local/blob/main/semantic-model-generator-to-datacatalog-local)
- 前回記事: [Snowflake Cortex Analyst をプライベート環境（AWS PrivateLink等）で動作させる方法](https://qiita.com/mshdtksk/items/71d92643da159066c68a)
- 前回記事: [Snowflakeでロール毎のお手製データカタログを作成する方法2](https://qiita.com/mshdtksk/items/177e5c31b83b6d0cf64d)