Column

コラム

  • 【テックコラム】Dataplex のメタデータ エクスポート...

【テックコラム】Dataplex のメタデータ エクスポート機能を試してみた

DataCurrent の金子です。Dataplex の メタデータ エクスポート 機能を試しました。

メタデータ エクスポートを使うと、Dataplex Universal Catalog に登録されているメタデータを Cloud Storage に出力できます。出力されたデータは BigQuery の外部テーブルとして分析したり、他のシステムと連携したりするのに活用できます。

※ この記事は、2026年1月時点の Google Cloud の公式ドキュメント Export metadata を参考にしています。内容は公開時点のものであり、最新情報は公式ドキュメントをご確認ください。

Dataplex のメタデータ エクスポートとは

Dataplex で管理しているテクニカルメタデータやビジネスメタデータを、指定した Cloud Storage バケットに JSONL 形式でエクスポートする機能です。

単なるバックアップとしてだけでなく、組織全体のデータ資産リストを BigQuery で集計・可視化する際に非常に有効です。

エクスポートを試してみた

特定のプロジェクトを対象にメタデータ エクスポート ジョブを実行しました。 実行方法は 公式ドキュメント の通り、API を呼び出すだけです。

まず、以下の request.json を作成しました。

{
  "type": "EXPORT",
  "export_spec": {
    "output_path": "gs://<BUCKET>/",
    "scope": {
      "projects": [
        "projects/<PROJECT_ID>"
      ]
    }
  }
}

続いて、以下のコマンドを実行しました。

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://dataplex.googleapis.com/v1/projects/<PROJECT_ID>/locations/asia-northeast1/metadataJobs?metadataJobId=test-kaneko-job-20260121"

約20分でジョブが完了しました。

1. エクスポート結果のディレクトリー構造

Cloud Storage に以下のような階層でファイルが出力されました。

gs://<BUCKET>/
  └── year=2026/
      └── month=01/
          └── day=21/
              └── consumer_project=<PROJECT_ID>/
                  └── job=test-kaneko-job-20260121/
                      └── project=<PROJECT_ID>/
                          ├── entry_group=@analyticshub/
                          │   └── 1.jsonl
                          ├── entry_group=@bigquery/
                          │   ├── 1.jsonl
                          │   └── 2.jsonl
                          ├── entry_group=@storage/
                          │   └── 1.jsonl
                          └── ...

ここからわかる特徴として、ディレクトリー構造がHive パーティション形式になっている点が挙げられます。これにより、BigQuery から読み込む際にパーティションとして認識可能です。

また、@bigquery や @storage といった entry_group ごとにディレクトリーが分かれているため、例えば「BigQuery のメタデータだけ解析したい」といった場合に、読み込むファイルを物理的に絞り込めます。

2. データの中身を見てみる

実際に出力された JSONL ファイルの中身を確認してみます。 今回は BigQuery テーブルのメタデータを例に説明します。

BigQuery テーブル

entry_group=@bigquery の配下のデータを見ると、aspects フィールドに詳細な情報が含まれています。 これは、BigQuery テーブルなどのシステムエントリーには、エントリータイプによって「必須アスペクト」が定義されており、Dataplex がスキーマ情報などを自動的に管理しているためです。

なお、以下の例では、検証用に test-kaneko-data-governance というカスタムアスペクトを付与しており、データガバナー、ビジネスオーナー、データ分類などの情報が含まれています。

{
  "entry": {
    "name": "projects/<PROJECT_NUMBER>/locations/asia-northeast1/entryGroups/@bigquery/entries/bigquery.googleapis.com/projects/<PROJECT_ID>/datasets/test_kaneko/tables/customerdata",
    "entryType": "projects/<PROJECT_NUMBER>/locations/global/entryTypes/bigquery-table",
    "createTime": "2025-03-25T07:26:36.584057Z",
    "updateTime": "2026-01-21T08:22:38.099295Z",
    "aspects": {
      "<PROJECT_NUMBER>.asia-northeast1.test-kaneko-data-governance": {
        "aspectType": "projects/<PROJECT_NUMBER>/locations/asia-northeast1/aspectTypes/test-kaneko-data-governance",
        "createTime": "2026-01-21T07:38:57.724020Z",
        "updateTime": "2026-01-21T07:38:57.724020Z",
        "data": {
          "data-governor": "<p>金子泰三(データガバナー)</p>",
          "business-owner": "<p>金子泰三(ビジネスオーナー)</p>",
          ...
        },
        "aspectSource": {}
      },
      "<PROJECT_NUMBER>.global.bigquery-policy": {
        "aspectType": "projects/<PROJECT_NUMBER>/locations/global/aspectTypes/bigquery-policy",
        "createTime": "2025-06-25T23:13:24.576782Z",
        "updateTime": "2026-01-21T08:22:38.099295Z",
        "data": {
          "numRowAccessPolicies": 0.0,
          "numColumnDataPolicies": 0.0,
          ...
        },
        "aspectSource": {
          "createTime": "2025-03-25T07:26:36.138Z",
          "updateTime": "2026-01-21T08:22:37.676Z",
          "dataVersion": "Ingestion/1.0.0"
        }
      },
      "<PROJECT_NUMBER>.global.bigquery-table": {
        "aspectType": "projects/<PROJECT_NUMBER>/locations/global/aspectTypes/bigquery-table",
        "createTime": "2025-03-25T07:26:36.584057Z",
        "updateTime": "2026-01-21T08:22:38.099295Z",
        "data": {
          "type": "TABLE",
          "tableType": "TABLE"
        },
        "aspectSource": {
          "createTime": "2025-03-25T07:26:36.138Z",
          "updateTime": "2026-01-21T08:22:37.676Z",
          "dataVersion": "Ingestion/1.0.0"
        }
      },
      "<PROJECT_NUMBER>.global.schema": {
        "aspectType": "projects/<PROJECT_NUMBER>/locations/global/aspectTypes/schema",
        "createTime": "2025-03-25T07:26:36.584057Z",
        "updateTime": "2026-01-21T08:22:38.099295Z",
        "data": {
          "fields": [
            {
              "name": "custid",
              "description": "The unique identifier for the customer.",
              ...
            },
            {
              "name": "custname",
              "description": "The customer's name.",
              ...
            },
            ...
          ]
        },
        "aspectSource": {
          "createTime": "2025-03-25T07:26:36.138Z",
          "updateTime": "2026-01-21T08:22:37.676Z",
          "dataVersion": "Ingestion/1.0.0"
        }
      },
      "<PROJECT_NUMBER>.global.storage": {
        "aspectType": "projects/<PROJECT_NUMBER>/locations/global/aspectTypes/storage",
        "createTime": "2025-03-25T07:26:36.584057Z",
        "updateTime": "2026-01-21T08:22:38.099295Z",
        "data": {
          "service": "BIGQUERY",
          "resourceName": "//bigquery.googleapis.com/projects/<PROJECT_ID>/datasets/test_kaneko/tables/customerdata"
        },
        "aspectSource": {
          "createTime": "2025-03-25T07:26:36.138Z",
          "updateTime": "2026-01-21T08:22:37.676Z",
          "dataVersion": "Ingestion/1.0.0"
        }
      },
      "<PROJECT_NUMBER>.global.usage": {
        "aspectType": "projects/<PROJECT_NUMBER>/locations/global/aspectTypes/usage",
        "createTime": "2025-12-12T08:41:59.056811Z",
        "updateTime": "2026-01-21T08:22:27.419798Z",
        "data": {
          "metrics": [
            {
              "name": "total_queries",
              ...
            },
            ...
          ],
          ...
        },
        "aspectSource": {
          "createTime": "2025-03-25T07:26:36.138Z",
          "updateTime": "2026-01-21T08:22:25.039Z"
        }
      }
    },
    "parentEntry": "projects/<PROJECT_NUMBER>/locations/asia-northeast1/entryGroups/@bigquery/entries/bigquery.googleapis.com/projects/<PROJECT_ID>/datasets/test_kaneko",
    "fullyQualifiedName": "bigquery:<PROJECT_ID>.test_kaneko.customerdata",
    "entrySource": {
      "resource": "projects/<PROJECT_ID>/datasets/test_kaneko/tables/customerdata",
      "system": "BIGQUERY",
      "platform": "GCP",
      "displayName": "customerdata",
      "description": "This table stores comprehensive details about customers. It includes information that can be used to identify and categorize customers. The data allows for analysis of customer demographics and characteristics. This enables targeted marketing and personalized customer experiences.",
      "labels": {
        "dataplex-data-documentation-published-location": "asia-northeast1",
        "dataplex-dp-published-scan": "crs-693a5002-0000-2149-bb57-c82add76d048",
        ...
      },
      "ancestors": [
        {
          "name": "projects/<PROJECT_ID>/datasets/test_kaneko",
          "type": "dataplex-types.global.bigquery-dataset"
        }
      ],
      "createTime": "2025-03-25T07:26:36.138Z",
      "updateTime": "2026-01-21T08:22:37.676Z",
      "location": "asia-northeast1"
    }
  }
}

BigQuery の場合、テーブルのスキーマ情報が entry.aspects 内の <PROJECT_NUMBER>.global.schema アスペクトとして詳細に出力されています。これにより、メタデータ エクスポート結果だけでテーブル定義を把握できます。

注意点として、aspects は Map 形式であり、キーにプロバイダーのプロジェクト番号などが含まれるため、クエリーで抽出する際は工夫が必要です。

必須アスペクトの種類

BigQuery テーブルには、以下のような 必須アスペクト が自動的に含まれていました。

  • <PROJECT_NUMBER>.global.bigquery-policy: テーブルに適用されているポリシーの数を含みます。行レベルアクセスポリシー (numRowAccessPolicies)、列レベルデータポリシー (numColumnDataPolicies)、タグの数 (numTags) などが記録されています。
  • <PROJECT_NUMBER>.global.bigquery-table: テーブルの基本情報を含みます。テーブルタイプ (type)、テーブルの種類 (tableType) が記録されています。
  • <PROJECT_NUMBER>.global.schema: テーブルのスキーマ定義を含みます。各カラムの名前 (name)、説明 (description)、データ型 (dataType)、メタデータ型 (metadataType)、モード (mode) が含まれています。
  • <PROJECT_NUMBER>.global.storage: テーブルが格納されているストレージサービスの情報を含みます。サービス名 (service)、リソース名 (resourceName) が記録されています。
  • <PROJECT_NUMBER>.global.usage: テーブルの利用状況を含みます。クエリー実行回数 (total_queries)、実行時間 (execution_time) が含まれています。

BigQuery で分析する

外部テーブルの作成方法 に記載されている通り、コンソールから外部テーブルを作成しました。

参考までに、作成時の DDL を以下に示します。

CREATE EXTERNAL TABLE `<PROJECT_ID>.<DATASET>.export_metadata`(
  entry
    STRUCT<
      name STRING,
      entryType STRING,
      createTime STRING,
      updateTime STRING,
      aspects JSON,
      parentEntry STRING,
      fullyQualifiedName STRING,
      entrySource
        STRUCT<
          resource STRING,
          system STRING,
          platform STRING,
          displayName STRING,
          description STRING,
          labels JSON,
          ancestors ARRAY<STRUCT<name STRING, type STRING>>,
          createTime STRING,
          updateTime STRING,
          location STRING>>,
  year INT64,
  month INT64,
  day INT64,
  consumer_project STRING,
  job STRING,
  project STRING,
  entry_group STRING)
  WITH
PARTITION
  COLUMNS
  OPTIONS (
    format = "NEWLINE_DELIMITED_JSON",
    hive_partition_uri_prefix = "gs://<BUCKET>/",
    uris = ["gs://<BUCKET>/year=2026/*"]);

これで、BigQuery 上でメタデータを分析できるようになりました。 例えば、以下のクエリーを実行すると、指定したジョブでエクスポートされたエントリー名と表示名の一覧を取得できます。

SELECT
  entry.name,
  entry.entrySource.displayName
FROM
  `<DATASET>.export_metadata`
WHERE
  year = 2026
  AND month = 1
  AND day = 21
  AND consumer_project = <PROJECT_ID>
  AND job = 'test-kaneko-job-20260121'
  AND project = <PROJECT_ID>
  AND entry_group = '@bigquery'

まとめ

今回は、Dataplex のメタデータ エクスポート機能を試しました。 実際にデータを見てみると、ディレクトリー構造が分析しやすく設計されている点や、エントリータイプによって情報の詳細度が異なる点がよくわかりました。

最後に

自社に専門人材がいない、リソースが足りない等の課題をお持ちの方に、エンジニア領域の支援サービス(Data Engineer Hub)をご提供しています。 お困りごとがございましたら是非お気軽にご相談ください。

本件に関するお問い合わせは下記にて承ります。
株式会社DataCurrent
info@datacurrent.co.jp

人気のコラムランキング

PICK UP

企業のDX推進におけるダッシュボード内製化について

DXmarketingPICK UP コラムダッシュボード内製化

企業のDX推進に向けた人材教育支援について

GA4marketingPICK UP コラム内製化

【データプライバシーコラム】電気通信事業法改正の解説(2022年7月時点)

CMPPICK UP コラムデータプライバシーデータプライバシーコラム個人情報保護

CMP導入時の注意点

CMPPICK UP コラムデータプライバシーデータプライバシーコラム個人情報保護

TOPへ
戻る