7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DataCatalog絵.jpg
データレイクにデータを溜めるだけでは、どこに何があるか分からない「データ沼(Data Swamp)」化してしまいます。それを防ぎ、データを安全かつ迅速に利活用するためにデータカタログが必要不可欠です。

■ はじめに

Object Storageをデータレイクとして使用していると、日次や時間単位でCSV、Parquetなどのファイルが増えていきます。

ファイル数が少ないうちはオブジェクト名を見れば内容を想像できますが、ファイルが増えてくると、次のようなことが分かりにくくなります。

  • どのバケットやフォルダ相当のプレフィックスに目的のデータがあるか
  • ファイルにどのような列が含まれているか
  • 各列が文字列、数値、日付、BOOLEANなど、どのようなデータ型なのか
  • 日付ごとに分割されたファイルが、どのデータセットに属するのか
  • 新しいファイルが追加されたとき、メタデータが更新されているか

OCI Data Catalogでは、Object Storageをデータ・アセットとして登録してハーベストすることで、ファイル名、パス、フィールド名、データ型などの技術メタデータを抽出し、検索可能なカタログとして管理できます。

CSVとApache Parquetは、OCI Data CatalogがObject Storageからフィールドを抽出できる対応形式です。また、ファイル名パターンを使用すると、日付ごとに分割された複数ファイルを1つの論理データ・エンティティとしてまとめられます。

今回の記事を第1回として、OCI Object Storageに保存した構造化データとドキュメントをOCI Data Catalogで管理し、最終的にAutonomous AI DatabaseのSelect AI with RAGへつなげるところまで検証してみてみます。

内容
第1回 Object Storage内のCSVとParquetをカタログ化し、データ型、論理データ・エンティティ、増分ハーベストを確認
第2回 Oracle DatabaseマニュアルPDFとdocument_inventory.parquetを使用し、PDFの基本メタデータとCustom Propertiesで文書名、製品バージョン、公式URL、Object Storage上の保存場所などを管理
第3回 Data Catalogで所在と管理情報を確認できるObject Storage上のPDFをAutonomous AI Databaseから読み込み、Vector Index化してSelect AI with RAGでマニュアルへ質問

3回の関係は次のとおりです。

第1回: CSV/Parquetの技術メタデータをカタログ化
        |
        | 同じObject Storageアクセスとハーベストの基盤を利用
        v
第2回: PDF原本+文書インベントリParquetをカタログ化
        |
        | 同じObject Storage上のPDFを利用
        v
第3回: Autonomous AI DatabaseでVector Index化
        |
        v
      Select AI with RAG

第1回では、Object Storage、Data Catalog、Resource Principalによるアクセス、データ・アセットの作成、ハーベストという基本的な流れを確認します。第2回では、同じ考え方をOracle DatabaseマニュアルPDFと文書インベントリParquetへ拡張し、第3回では同じObject Storage上のPDFをAutonomous AI Databaseから読み込んでVector Index化します。

ということで、同じ注文データをCSVとParquetで作成してObject Storageへ配置し、OCI Data Catalogで自動カタログ化してみてみます。

なお、本記事でいう「自動カタログ化」は、初回設定後のメタデータ更新を、増分ハーベストとスケジュールで定期実行する構成を指します。

今回は、次の内容を確認します。

確認項目 内容
CSVとParquet 同じレコードを2つの形式で用意
技術メタデータ 列名とデータ型を技術メタデータとして抽出
日本語データ 顧客名、都道府県、商品名、備考に日本語を格納したCSV/Parquetを使用
NULL coupon_usednotesにNULLを格納
論理データ・エンティティ 日付ごとの複数ファイルを形式単位で集約
増分ハーベスト 新しい日付ファイルだけを追加して再ハーベスト
スケジュール ハーベスト・ジョブを定期実行

■ Agenda

■ 今回作成する構成

今回の構成は次のとおりです。

ローカルPC / OCI Cloud Shell
        |
        | oci os object bulk-upload
        v
OCI Object Storage
└── demo/
    ├── sales_orders_csv/
    │   ├── dt=2026-07-20/*.csv
    │   └── dt=2026-07-21/*.csv
    └── sales_orders_parquet/
        ├── dt=2026-07-20/*.parquet
        └── dt=2026-07-21/*.parquet
        |
        | Harvest(Resource Principal)
        v
OCI Data Catalog
├── Object Storage Data Asset
├── Filename Pattern
├── Harvest Job
├── sales_orders_csv Logical Data Entity
└── sales_orders_parquet Logical Data Entity
    └── Attributes / Data Types

初回は2026年7月20日と21日のファイルをアップロードします。その後、2026年7月22日のファイルを追加し、増分ハーベストを確認します。

● 今回確認する結果

今回の検証では、Object Storageへ日付ごとに分割したCSVとParquetファイルを配置し、ファイル名パターンを使用してData Catalogへハーベストします。

先に結果をまとめると、初回ハーベスト後にファイルを追加しても、ファイル名パターンに一致するファイルは、同じ論理データ・エンティティへまとめて管理されました。

確認タイミング Object Storage内のファイル数 論理データ・エンティティ数 確認する内容
初回ハーベスト後 4ファイル 2エンティティ CSVとParquetが、それぞれ1つの論理データ・エンティティとして作成される
増分ハーベスト後 6ファイル 2エンティティ 新しいファイルが追加されても、既存の論理データ・エンティティへまとめられる

つまり、Object Storage上では日付ごとにファイルが増えていきますが、Data Catalog上ではCSVとParquetをそれぞれデータセット単位で探せる状態を維持します。

このあと、実際にファイルを配置して初回ハーベストを実行し、CSVとParquetの属性型の違いを確認します。さらに新しい日付のファイルを追加し、増分ハーベストによって既存の論理データ・エンティティへ反映されるか確認してみてみます。

■ 使用するリソース名

本記事では、次の名前を例として使用します。実際の環境に合わせて置き換えます。

リソース 設定例
Object Storageバケット data-catalog-csv-parquet-demo
Data Catalog data-catalog-demo
動的グループ data-catalog-demo-dg
IAMポリシー data-catalog-object-storage-read-policy
データ・アセット object-storage-csv-parquet-demo
接続 object-storage-resource-principal
ファイル名パターン sales-orders-format-pattern
ハーベスト・ジョブ sales-orders-harvest-job
スケジュール sales-orders-daily-harvest

■ テストデータの確認

● テストデータの構成

今回使用するテストデータは、次の3段階に分けています。

oci_data_catalog_blog_part1_csv_parquet/
├── 01_initial_upload/
│   └── demo/
│       ├── sales_orders_csv/
│       │   ├── dt=2026-07-20/
│       │   └── dt=2026-07-21/
│       └── sales_orders_parquet/
│           ├── dt=2026-07-20/
│           └── dt=2026-07-21/
├── 02_incremental_upload/
│   └── demo/
│       ├── sales_orders_csv/dt=2026-07-22/
│       └── sales_orders_parquet/dt=2026-07-22/
└── 03_optional_schema_evolution/
    └── demo/
        ├── sales_orders_csv/dt=2026-07-23/
        └── sales_orders_parquet/dt=2026-07-23/

第1回では、01_initial_upload02_incremental_uploadを使用します。

03_optional_schema_evolutionには列を追加したスキーマ・バージョン2を収録していますが、こちらは本シリーズとは別の追加検証用とします。

・ テストデータ:
oci_data_catalog_blog_part1_csv_parquet.zip

・ チェックサム:
SHA256SUMS.txt

ZIPを展開し、Pythonパッケージは仮想環境へインストールします。

コマンド
unzip oci_data_catalog_blog_part1_csv_parquet.zip
cd oci_data_catalog_blog_part1_csv_parquet

python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt

以降のコマンドは、仮想環境を有効にしたプロジェクト・ルートで実行します。

● CSVデータの確認

2026年7月20日のCSVは、次のような内容です。

csvファイル内容
order_id,order_timestamp,order_date,customer_id,customer_name,prefecture,product_id,product_name,quantity,unit_price,amount,payment_method,coupon_used,notes,source_system,schema_version
SO-20260720-001,2026-07-20T00:12:00Z,2026-07-20,C001,佐藤 花子,東京都,P100,OCI Data Catalog 入門,1,12800,12800,VISA,true,初回購入,demo-commerce,1
SO-20260720-002,2026-07-20T01:05:00Z,2026-07-20,C002,鈴木 一郎,神奈川県,P300,Parquet データ分析,2,15800,31600,BANK_TRANSFER,false,,demo-commerce,1
SO-20260720-003,2026-07-20T02:20:00Z,2026-07-20,C003,高橋 美咲,大阪府,P200,Object Storage 実践,1,9800,9800,PAYPAY,,領収書希望,demo-commerce,1

初回データの内容は次のとおりです。

項目
CSVファイル数 2
Parquetファイル数 2
1ファイルの行数 6
CSVの合計行数 12
Parquetの合計行数 12
列数 16
注文金額の合計 243,000
coupon_usedがNULLの行 2
notesがNULLの行 3

CSVとParquetには、同じレコードを格納しています。

● Parquetスキーマの確認

Parquetは列指向のファイル形式で、ファイル内に列名、物理型、論理型、NULL可否などのスキーマ情報を保持します。

同梱スクリプトでParquetのスキーマを確認します。

Parquetファイル内容確認コマンド
python scripts/inspect_parquet.py \
  01_initial_upload/demo/sales_orders_parquet/dt=2026-07-20/sales_orders_20260720_part001.parquet

主な出力は次のとおりです。

出力結果
% python scripts/inspect_parquet.py 01_initial_upload/demo/sales_orders_parquet/dt=2026-07-20/sales_orders_20260720_part001.parquet
    File       : 01_initial_upload/demo/sales_orders_parquet/dt=2026-07-20/sales_orders_20260720_part001.parquet
    Size       : 2473 bytes
    Rows       : 6
    Created by : oci-data-catalog-blog-testdata 1.0
    Schema:
      - order_id: BYTE_ARRAY / UTF8 (REQUIRED)
      - order_timestamp: INT64 / TIMESTAMP_MILLIS (REQUIRED)
      - order_date: INT32 / DATE (REQUIRED)
      - customer_id: BYTE_ARRAY / UTF8 (REQUIRED)
      - customer_name: BYTE_ARRAY / UTF8 (REQUIRED)
      - prefecture: BYTE_ARRAY / UTF8 (REQUIRED)
      - product_id: BYTE_ARRAY / UTF8 (REQUIRED)
      - product_name: BYTE_ARRAY / UTF8 (REQUIRED)
      - quantity: INT32 (REQUIRED)
      - unit_price: DOUBLE (REQUIRED)
      - amount: DOUBLE (REQUIRED)
      - payment_method: BYTE_ARRAY / UTF8 (REQUIRED)
      - coupon_used: BOOLEAN (OPTIONAL)
      - notes: BYTE_ARRAY / UTF8 (OPTIONAL)
      - source_system: BYTE_ARRAY / UTF8 (REQUIRED)
      - schema_version: INT32 (REQUIRED)
    Preview:
    [
      {
        "order_id": "SO-20260720-001",
        "order_timestamp": "2026-07-20T00:12:00+00:00",
        "order_date": "2026-07-20",
        "customer_id": "C001",
        "customer_name": "佐藤 花子",
        "prefecture": "東京都",
        "product_id": "P100",
        "product_name": "OCI Data Catalog 入門",
        "quantity": 1,
        "unit_price": 12800.0,
        "amount": 12800.0,
        "payment_method": "VISA",
        "coupon_used": true,
        "notes": "初回購入",
        "source_system": "demo-commerce",
        "schema_version": 1
      },
      {
        "order_id": "SO-20260720-002",
        "order_timestamp": "2026-07-20T01:05:00+00:00",
        "order_date": "2026-07-20",
        "customer_id": "C002",
        "customer_name": "鈴木 一郎",
        "prefecture": "神奈川県",
        "product_id": "P300",
        "product_name": "Parquet データ分析",
        "quantity": 2,
        "unit_price": 15800.0,
        "amount": 31600.0,
        "payment_method": "BANK_TRANSFER",
        "coupon_used": false,
        "notes": null,
        "source_system": "demo-commerce",
        "schema_version": 1
      },
      {
        "order_id": "SO-20260720-003",
        "order_timestamp": "2026-07-20T02:20:00+00:00",
        "order_date": "2026-07-20",
        "customer_id": "C003",
        "customer_name": "高橋 美咲",
        "prefecture": "大阪府",
        "product_id": "P200",
        "product_name": "Object Storage 実践",
        "quantity": 1,
        "unit_price": 9800.0,
        "amount": 9800.0,
        "payment_method": "PAYPAY",
        "coupon_used": null,
        "notes": "領収書希望",
        "source_system": "demo-commerce",
        "schema_version": 1
      }
    ]

今回の比較で特に確認したい列は次のとおりです。

CSV上の表現 Parquet内部の型
order_timestamp 2026-07-20T00:12:00Z INT64 / TIMESTAMP_MILLIS
order_date 2026-07-20 INT32 / DATE
quantity 1 INT32
unit_price 12800 DOUBLE
coupon_used truefalse、空欄 BOOLEAN (OPTIONAL)
notes 日本語、空欄 UTF8 (OPTIONAL)

CSVでは値がテキストとして保存されます。一方、ParquetではDATE、TIMESTAMP、BOOLEANなどの型とNULL可否をファイル内部に保持できます。

■ 初回データをObject Storageへアップロード

● Object Storageバケットの作成

OCIコンソールで、今回使用するObject Storageバケットを作成します。

1) Object Storageバケット画面
ナビゲーション・メニューから[ストレージ] > [バケット]をクリックします。
01_ObjectStorage00.jpg

次の設定例でバケットを作成します。

項目 設定例
コンパートメント <compartment-name>
バケット名 data-catalog-csv-parquet-demo
デフォルト・ストレージ層 標準

01_ObjectStorage01.jpg

● 初回データのアップロード

1) 初回データ・アップロード
01_initial_upload配下を一括アップロードします。

コマンド
oci os object bulk-upload \
  --bucket-name data-catalog-csv-parquet-demo \
  --src-dir ./01_initial_upload \
  --verify-checksum
コマンド実行結果
% oci os object bulk-upload \
  --bucket-name data-catalog-csv-parquet-demo \
  --src-dir ./01_initial_upload \
  --verify-checksum
    ・・・
    Uploaded demo/sales_orders_csv/dt=2026-07-20/sales_orders_20260720_part001.csv  [####################################]  100%
    ・・・
    Uploaded demo/sales_orders_csv/dt=2026-07-21/sales_orders_20260721_part001.csv  [####################################]  100%
    Uploaded demo/sales_orders_parquet/dt=2026-07-20/sales_orders_20260720_part001.parquet  [####################################]  100%
    Uploaded demo/sales_orders_parquet/dt=2026-07-21/sales_orders_20260721_part001.parquet  [####################################]  100%
結果まとめ
skipped-objects : なし
upload-failures : なし
checksum        : 4ファイルとも一致

bulk-uploadでは、--src-dir配下のサブディレクトリが、そのままObject Storageのオブジェクト名に反映されます。

アップロード後は、次の4ファイルが配置されます。

demo/sales_orders_csv/dt=2026-07-20/sales_orders_20260720_part001.csv
demo/sales_orders_csv/dt=2026-07-21/sales_orders_20260721_part001.csv
demo/sales_orders_parquet/dt=2026-07-20/sales_orders_20260720_part001.parquet
demo/sales_orders_parquet/dt=2026-07-21/sales_orders_20260721_part001.parquet

2) 初回データ・アップロード確認
OCIコンソールでは今回のようなプレフィックス階層をツリー形式で一覧しにくいため、ここではOCI CLIのoci os object listでもdemo/配下をまとめて確認します。

・ OCIコンソールのバケット画面で確認

アップロードしたファイルを確認します。
01_ObjectStorage01.jpg

・ OCI CLIで確認

oci os object listdemo/配下をまとめて確認します。

コマンド
% oci os object list \
  --bucket-name data-catalog-csv-parquet-demo \
  --prefix "demo/" \
  --all \
  --query 'data[].name' \
  --raw-output
  
    [
      "demo/sales_orders_csv/dt=2026-07-20/sales_orders_20260720_part001.csv",
      "demo/sales_orders_csv/dt=2026-07-21/sales_orders_20260721_part001.csv",
      "demo/sales_orders_parquet/dt=2026-07-20/sales_orders_20260720_part001.parquet",
      "demo/sales_orders_parquet/dt=2026-07-21/sales_orders_20260721_part001.parquet"
    ]

この時点では、初回ハーベスト対象の2026年7月20日と21日の4ファイルだけが配置されています。

■ OCI Data Catalogの作成

すでにData Catalogを作成済みの場合は、この手順を省略できます。

1) OCIコンソールからData Catalogを開く
ナビゲーション・メニューから[分析とAI] > [データ・レイク] > [データ・カタログ]をクリックします。
02_DataCatalog作成01.jpg

2) Data Catalog一覧画面
「データ・カタログの作成」をクリックします。

02_DataCatalog作成02.jpg

3) Data Catalog作成画面
次の項目を設定し、[Create]をクリックします。

項目 設定例
コンパートメントに作成 <compartment-name>
名前 data-catalog-demo

02_DataCatalog作成03.png

4) Data Catalog作成完了
作成したData Catalogを開き、OCIDを控えておきます。次の動的グループで使用します。
02_DataCatalog作成05.jpg

■ Resource Principal用IAMポリシーの作成

Data CatalogからObject Storageへアクセスできるように、動的グループとIAMポリシーを作成します。

● 動的グループの作成

1) 動的グループ画面
OCIコンソールから[アイデンティティとセキュリティ] > [ドメイン]を開き、対象ドメインの[動的グループ]タブで[動的グループの作成]をクリックします。
00_動的グループ作成00.jpg

2) 動的グループ作成画面

動的グループ名をdata-catalog-demo-dgとし、次の一致ルールを設定します。

Any {resource.id = '<Data CatalogのOCID>'}

00_動的グループ作成01.png

● Object Storage読取りポリシーの作成

1) ポリシー編集画面
今回のバケットだけを読み取れるように、対象を限定したポリシーを作成します。

Policy Statement
Allow dynamic-group data-catalog-demo-dg to read object-family
in compartment <compartment-name>
where any {target.bucket.name='data-catalog-csv-parquet-demo'}

公式チュートリアルのようにテナンシ全体へ権限を付与することもできますが、今回は検証用バケットへ範囲を限定します。

ナビゲーション・メニューから[アイデンティティとセキュリティ] > [ポリシー]を開き、対象ポリシーの[ステートメント]タブで[Edit Policy Statements]をクリックして登録します。

00_Object Storage読取りポリシーの作成01.jpg

2) ポリシー・ステートメント登録完了
00_Object Storage読取りポリシーの作成02.jpg

■ ファイル名パターンの作成

Object Storageには、2日分で合計4ファイルあります。このまま個別ファイルとしてハーベストすると、ファイル数に応じてデータ・エンティティが増えていきます。

今回は、CSVファイル群とParquetファイル群を、それぞれ1つの論理データ・エンティティへまとめます。

1) Data Catalog Home画面
Data CatalogのHome画面にある+をクリックし、リストから[ファイル名パターンの管理]をクリックします。
03_DataCatalog-FilenamePatterns作成01.jpg

2) ファイル名パターン画面
「ファイル名パターンの作成」をクリックします。

03_DataCatalog-FilenamePatterns作成02.jpg

3) ファイル名パターンの作成画面
次のように設定し、[作成]をクリックします。

項目 設定値
名前 sales-orders-format-pattern
説明 CSVとParquetを形式単位で論理データ・エンティティ化
パターン・タイプ 正規表現

式は次のとおりです。

{bucketName:data-catalog-csv-parquet-demo}/demo/{logicalEntity:sales_orders_csv|sales_orders_parquet}/.*$

バケット名が異なる場合は、data-catalog-csv-parquet-demoを実際のバケット名へ置き換えます。
03_DataCatalog-FilenamePatterns作成04.jpg

4) ファイル名パターンの作成完了
03_DataCatalog-FilenamePatterns作成05.jpg

● テスト式で確認

1) ファイル名パターン画面
作成したファイル名パターンをクリックし、[Test]をクリックします。
03_DataCatalog-FilenamePatterns作成06-1.jpg

2) Test Expression画面
次のオブジェクト名を「テスト・ファイル名」へ貼り付けます。

Test filenames入力内容
data-catalog-csv-parquet-demo/demo/sales_orders_csv/dt=2026-07-20/sales_orders_20260720_part001.csv
data-catalog-csv-parquet-demo/demo/sales_orders_csv/dt=2026-07-21/sales_orders_20260721_part001.csv
data-catalog-csv-parquet-demo/demo/sales_orders_parquet/dt=2026-07-20/sales_orders_20260720_part001.parquet
data-catalog-csv-parquet-demo/demo/sales_orders_parquet/dt=2026-07-21/sales_orders_20260721_part001.parquet

[Test Expression]をクリックし、CSVとParquetが別々の論理データ・エンティティとして導出されることを確認します。
03_DataCatalog-FilenamePatterns作成07.jpg

テスト結果では、sales_orders_csvsales_orders_parquetに対応する2つのグループが導出されました。画面上の論理データ・エンティティ名には、バケット名が付加される場合があります。

■ Object Storageデータ・アセットの作成

1) Data Catalog Home画面
[データ・アセットの作成]をクリックします。
04_DataCatalog-DataAssets作成01.jpg

2) データ・アセット作成画面
次のように設定し、[作成]をクリックします。

項目 設定例
名前 object-storage-csv-parquet-demo
タイプ Oracle Object Storage
URL https://swiftobjectstorage.<region-identifier>.oraclecloud.com
ネームスペース <Object Storage Namespace>
※Object Storageの画面で確認できます

東京リージョンの場合のURL例は次のとおりです。

https://swiftobjectstorage.ap-tokyo-1.oraclecloud.com

Object Storageネームスペースは、OCIコンソールのテナンシ詳細にある「オブジェクト・ストレージ設定」で確認できます。

04_DataCatalog-DataAssets作成02.jpg

3) データ・アセット作成完了
04_DataCatalog-DataAssets作成03.jpg

04_DataCatalog-DataAssets作成04.jpg

■ Resource Principal接続の追加

作成したデータ・アセットを開き、「接続情報」から[接続の追加]をクリックします。

1) データ・アセット: 接続の追加画面

次の項目を設定し、[接続のテスト]をクリックして、接続に成功することを確認します。

項目 設定例
名前 object-storage-resource-principal
タイプ Resource Principal
OCIリージョン Object Storageと同じリージョン
コンパートメント バケットを作成したコンパートメント
デフォルト接続 有効

Resource Principalは、Object Storageデータ・アセットに対する推奨接続方式です。

05_DataCatalog-Connection作成01.jpg

2) 接続の追加: 接続のテスト成功画面
接続のテストが成功したら、[追加]をクリックします。
05_DataCatalog-Connection作成02.jpg

3) 接続の追加完了
データ・アセット画面の接続の項目に、追加した内容が表示されます。
05_DataCatalog-Connection作成03.jpg

■ ファイル名パターンをデータ・アセットへ割り当て

データ・アセットの「サマリー」タブにある「ファイル名パターン」から、作成したパターンを割り当てます。

1) データ・アセット サマリー画面
[ファイル名パターンの割当て]をクリックします。
05_DataCatalog-Connection作成03のコピー.png

2) ファイル名パターンの割当て画面
sales-orders-format-patternを選択し、[割り当て]をクリックします。

06_DataCatalog-Filename割り当て01.jpg

3) ファイル名パターンの割当て完了
データ・アセット サマリー画面に割り当てたファイル名パターンが追加されます。
06_DataCatalog-Filename割り当て02.jpg

ファイル名パターンは、初回ハーベストより前に割り当てておきます。ハーベスト後に新しいパターンを割り当てたり、式を変更したりすると、既存の論理データ・エンティティが非アクティブになる場合があります。その場合は、変更を反映するために完全ハーベスト(フル・ハーベスト)を実行します。

■ 初回ハーベストの実行

作成したデータ・アセットを開き、サマリー画面からハーベストを開始します。

1) データ・アセットの詳細画面
データ・アセットの詳細画面で[Harvest]をクリックします。
06_DataCatalog-Harvest実行01.jpg

2) Harvest: 接続の選択画面
デフォルト接続として作成したobject-storage-resource-principalを選択します。

06_DataCatalog-Harvest実行02.jpg

3) Harvest: ハーベスト対象の選択画面
「使用可能なバケット」から、data-catalog-csv-parquet-demoをハーベスト対象へ追加します。

06_DataCatalog-Harvest実行03.jpg

4) Harvest: ジョブの作成画面
次のように設定し、[ジョブの作成]をクリックします。

項目 設定値
ジョブ名 sales-orders-harvest-job
増分ハーベスト 有効
認識されないファイルを含める 無効
一致したファイルのみを含める 有効
実行時刻 今すぐジョブを実行

「増分ハーベスト」を有効にすると、初回実行後は変更または追加された対象を中心にハーベストします。今回のような論理データ・エンティティでは、既存のファイル名パターンに一致する新規ファイルが、対応する論理データ・エンティティへ追加されます。

「一致したファイルのみを含める」を有効にすることで、割り当てたファイル名パターンに一致するCSVとParquetだけを対象にします。

06_DataCatalog-Harvest実行04.jpg

5) Harvest: ジョブのSUCCEEDEDを確認
ジョブを作成し、ステータスがSUCCEEDEDになることを確認します。

06_DataCatalog-Harvest実行05.jpg

■ 論理データ・エンティティの確認

フィルタでデータ・エンティティ・タイプを「論理」に設定します。

1) Data Catalog Home画面
[データ・エンティティ]をクリックします。
07_DataCatalog-DataEntity確認01のコピー.jpg

2) データ・エンティティ画面
CSVとParquetの2つの論理データ・エンティティが作成されていることを確認します。
07_DataCatalog-DataEntity確認02.jpg

それぞれの論理データ・エンティティには、2026年7月20日と21日の2ファイルが関連付けられました。

3) CSVデータ・エンティティ画面
作成したCSVの論理データ・エンティティ画面にある「ファイル」タブを開き、2026年7月20日と21日の2ファイルが含まれていることを確認します。
07_DataCatalog-DataEntity確認03-CSVファイル一覧01.jpg

4) Parquetデータ・エンティティ画面
作成したParquetの論理データ・エンティティ画面にある「ファイル」タブを開き、2026年7月20日と21日の2ファイルが含まれていることを確認します。
07_DataCatalog-DataEntity確認04-Parquetファイル一覧01.jpg

■ CSVとParquetの属性を比較

各論理データ・エンティティの「属性」タブを開き、列名とデータ型を比較します。

今回のデータには16列あります。

order_id
order_timestamp
order_date
customer_id
customer_name
prefecture
product_id
product_name
quantity
unit_price
amount
payment_method
coupon_used
notes
source_system
schema_version

● CSV属性確認

1) sales_orders_csv: Summary画面
[Attributes]タブをクリックします。
08_DataCatalog-DataEntity-sales_orders_CSV確認01.jpg

2) sales_orders_csv: Attributes画面
列名とデータ型を確認します。
08_DataCatalog-DataEntity-sales_orders_CSV確認02.jpg

08_DataCatalog-DataEntity-sales_orders_CSV確認03-1.jpg

● Parquet属性確認

1) sales_orders_parquet: Summary画面
[Attributes]タブをクリックします。
09_DataCatalog-DataEntity-sales_orders_parquet確認01.jpg

2) sales_orders_parquet: Attributes画面
列名とデータ型を確認します。
09_DataCatalog-DataEntity-sales_orders_parquet確認02.jpg

09_DataCatalog-DataEntity-sales_orders_parquet確認03-1.jpg

実測結果のうち、型の違いが分かりやすい主な属性を次の表に整理します。

属性 CSVで表示された型 Parquetで表示された型 Parquet内部の型
order_id String STRING UTF8
order_timestamp String TIMESTAMP(MILLIS, true) TIMESTAMP_MILLIS
order_date String TIMESTAMP(MILLIS, true) DATE
customer_name String STRING UTF8
quantity Long INTEGER(32,true) INT32
unit_price Long DOUBLE DOUBLE
amount Long DOUBLE DOUBLE
coupon_used String BOOLEAN BOOLEAN / OPTIONAL
notes String STRING UTF8 / OPTIONAL
schema_version Long INTEGER(32,true) INT32

実測では、CSVのorder_timestamporder_datecoupon_usedStringとして表示されました。一方、CSVの整数値はLongとして推定されています。CSVファイル自体にはスキーマが埋め込まれていないため、Data Catalogが内容を解析して型を推定した結果です。

Parquetでは、order_timestampTIMESTAMP(MILLIS, true)coupon_usedBOOLEANquantityINTEGER(32,true)として表示されました。ファイル内でDOUBLEとして定義したunit_priceamountも、Data Catalog上でDOUBLEとして確認できました。

特に興味深かったのは、Parquet内部ではDATEとして定義したorder_dateが、Data Catalog上ではTIMESTAMP(MILLIS, true)と表示された点です。少なくとも今回の環境では、Parquet内部の論理型とData Catalog上の属性型が1対1ではなく、カタログ側の型へマッピングされて表示されました。

また、Parquet内部ではcoupon_usednotesOPTIONALとして作成していますが、Data Catalogの属性一覧ではNULL可否までは確認できませんでした。日本語を含むCSVとParquetのハーベストは成功しました。ただし、Data Catalogの主目的はメタデータ管理であり、今回確認した属性画面にはデータ値が表示されません。日本語値そのものの表示や文字化けの有無は、別の読取りツールで確認する必要があります。

■ ハーベスト・ジョブをスケジュール

初回ハーベストが成功したため、同じジョブを定期実行するスケジュールを作成します。

Data Catalogのスケジュールでは、毎時、毎日、毎週、毎月を選択できます。

1) Data Catalog Home画面
[Schedules]タブをクリックし、スケジュール画面を表示します。
10_DataCatalog-スケジュール作成01.jpg

2) スケジュール一覧画面
スケジュール作成ボタンをクリックします。
10_DataCatalog-スケジュール作成02.jpg

3) スケジュール作成画面
次のように設定し、[Schedule]をクリックします。

項目 設定例
ジョブ sales-orders-harvest-job
名前 sales-orders-daily-harvest
頻度 毎日
ローカル開始時刻 03:00
ローカル終了時刻 検証期間に合わせて設定

10_DataCatalog-スケジュール作成03.jpg

4) スケジュール作成完了
10_DataCatalog-スケジュール作成04.jpg

これで、初回設定後はObject Storageへ追加されたファイルのメタデータを定期的に更新できるようになります。

■ 増分データを追加

● 増分データの追加

初回ハーベスト後、2026年7月22日のCSVとParquetを追加します。

1) 2026年7月22日のCSVとParquetファイル追加

コマンド
oci os object bulk-upload \
  --bucket-name data-catalog-csv-parquet-demo \
  --src-dir ./02_incremental_upload \
  --verify-checksum

追加されるオブジェクトは次の2つです。

demo/sales_orders_csv/dt=2026-07-22/sales_orders_20260722_part001.csv
demo/sales_orders_parquet/dt=2026-07-22/sales_orders_20260722_part001.parquet
コマンド実行結果
% oci os object bulk-upload \
  --bucket-name data-catalog-csv-parquet-demo \
  --src-dir ./02_incremental_upload \
  --verify-checksum

Uploaded demo/sales_orders_csv/dt=2026-07-22/sales_orders_20260722_part001.csv  [####################################]  100%
Uploaded demo/sales_orders_parquet/dt=2026-07-22/sales_orders_20260722_part001.parquet  [####################################]  100%
結果まとめ
skipped-objects : なし
upload-failures : なし
checksum        : 2ファイルとも一致

2) バケット画面: 追加したCSVファイルを確認
demo/sales_orders_csv/dt=2026-07-22/sales_orders_20260722_part001.csvを確認します。

11_DataCatalog-増分データ追加-CSV01.jpg

3) バケット画面: 追加したParquetファイルを確認
demo/sales_orders_parquet/dt=2026-07-22/sales_orders_20260722_part001.parquetを確認します。

11_DataCatalog-増分データ追加-Parquet01.jpg

今回は、日次スケジュールを作成するところまで確認しました。2026年7月22日分の増分反映は、スケジュール実行を待たず、ジョブを手動で再実行して確認します。

● ジョブを手動実行

スケジュール実行を待つこともできますが、今回は増分結果をすぐに確認するため、「ジョブ」画面からsales-orders-harvest-jobを手動で再実行します。

増分ハーベスト完了後、CSVとParquetの論理データ・エンティティを開き、「ファイル」タブに2026年7月22日分が追加されたことを確認します。

1) Data Catalogのジョブ画面

12_DataCatalog-増分データ追加Job実行01.jpg

2) ジョブを実行
[Run]をクリックしてジョブを実行します。
12_DataCatalog-増分データ追加Job実行02.jpg

3) ジョブ実行中

12_DataCatalog-増分データ追加Job実行03.jpg

4) ジョブ完了
ジョブが完了し、ステータスがSUCCEEDEDになったことを確認します。
12_DataCatalog-増分データ追加Job実行04.jpg

● 増分データの追加確認

初回と増分の結果を整理します。

項目 初回 増分後
CSVファイル数 2 3
Parquetファイル数 2 3
テストデータのCSV合計行数 12 18
テストデータのParquet合計行数 12 18
論理データ・エンティティ数 2 2

ファイルは増えましたが、論理データ・エンティティはCSV用とParquet用の2つのままです。

1) 追加したCSVファイルを確認
13_DataCatalog-増分データ追加Job実行後-CSVファイル一覧01.jpg

2) 追加したParquetファイルを確認
13_DataCatalog-増分データ追加Job実行後-Parquetファイル一覧01.jpg

■ CSVとParquetをカタログ化して分かったこと

今回の検証では、Object Storage上に日付ごとに分割して配置したCSVとParquetを、OCI Data Catalogで形式単位の論理データ・エンティティとして管理する構成を作成しました。

実測結果をもとに、次のように整理できます。

観点 CSV Parquet
ファイル内スキーマ ヘッダーに列名は持てるが、データ型を含むスキーマは保持しない 列名、型、NULL可否などを保持
Data Catalogでの日時 String TIMESTAMP(MILLIS, true)
Data Catalogでの日付 String 内部はDATEだが、画面ではTIMESTAMP(MILLIS, true)
Data CatalogでのBOOLEAN String BOOLEAN
Data Catalogでの数値 サンプル値からLongと推定 INTEGER(32,true)またはDOUBLE
NULL可否 空欄との区別に注意 ファイル内部ではOPTIONALだが、属性一覧では直接確認できない
日付別ファイルの管理 ファイル名パターンで1つの論理データ・エンティティへ集約 同左

今回の検証では、Parquet内部の型とData Catalog上の型が、必ずしも同じ名称で表示されないことも確認できました。Data Catalogは元ファイルを書き換えるのではなく、抽出したメタデータを標準化してカタログへ登録します。そのため、ファイル内部の型を厳密に確認するときはParquet検査ツール、データセットの所在や検索にはData Catalogというように使い分けると分かりやすくなります。

論理データ・エンティティを使用することで、日付ファイルが増えても、データ・カタログ上ではデータセット単位で探しやすい状態を維持できます。

また、増分ハーベストとスケジュールを組み合わせることで、Object Storageへ新しいファイルが追加された後のメタデータ更新を自動化できます。

■ Data Catalogが自動でしてくれること、人が設計すること

今回、Object Storageをハーベストすると、ファイル名、パス、形式、フィールド名、データ型などの技術メタデータが自動的に収集されました。

ここだけを見ると、Object Storageへファイルを保存すれば、Data Catalogがファイルの内容を理解し、業務単位のデータセットへ自動的に整理してくれるようにも見えます。

しかし、今回CSVとParquetを実際にカタログ化してみて、Data Catalogが自動で収集してくれる範囲と、データを作成・運用する側が設計する範囲は、分けて考える必要があると分かりました。

● 自動収集しやすいメタデータと、人が設計するメタデータ

メタデータは、すべてを同じものとして考えるのではなく、次の3つに分けると分かりやすくなります。

  • ファイル管理メタデータ: ファイル名、パス、形式、サイズ、更新日時など
  • 技術メタデータ: フィールド名、データ型、スキーマ、パーティションなど
  • 業務メタデータ: データの意味、Owner、品質基準、機密区分、利用条件など

Data Catalogが自動収集しやすいのは、元ファイルから機械的に判別できるファイル管理メタデータと技術メタデータです。一方、データが業務上何を意味するのか、誰が管理するのか、どの品質を満たすべきかといった情報は、人が定義して運用する必要があります。

項目 Data Catalogで自動収集しやすい 人が設計・運用すること
ファイル名、パス、形式 命名規則、フォルダ構成、配置規則
サイズ、更新日時 保持期間、更新サイクル
CSV/Parquetのフィールド 列名、型、スキーマの統一
複数ファイルのグループ化 ファイル名パターンを設計してData Catalogへ登録
データの業務上の意味 × 用語、説明、利用目的を定義
Owner、管理責任者 × Owner/Data Stewardを決定
品質、正確性、鮮度 × 品質基準、検証方法、監視方法を設計
機密区分、利用条件 × 分類、権限、ガバナンスを設計
分析・AI向けデータセット × 加工、統合、重複排除、構造化を実施

対応形式であれば、Data CatalogはObject Storage内のファイルからフィールド情報を抽出できます。一方、未対応形式から収集できるのは、主にファイル名やパスなどの基本情報です。Oracle公式ドキュメント

また、複数ファイルを1つの論理データ・エンティティへまとめる場合も、Data Catalogが業務内容を推測して自動的に仕分けるわけではありません。どのファイルを同じデータセットとして扱うのかを表すファイル名パターンを、人が設計してデータ・アセットへ割り当てます。Oracle公式ドキュメント

● 今回の検証でも、事前にデータを設計していた

今回の検証では、Data Catalogを実行する前に、次のような設計を行っていました。

今回の作業 自動収集/事前設計
ファイル名、パス、形式の取得 Data Catalogが自動収集
CSV/Parquetのフィールド取得 Data Catalogが自動収集
sales_orders_YYYYMMDD_part001という命名 事前に人が設計
sales_orders_csvsales_orders_parquetのフォルダ分離 事前に人が設計
dt=YYYY-MM-DDによる日付別の配置 事前に人が設計
Parquetの列名とデータ型 Parquet作成時に人が設計
CSVとParquetを分けてまとめるファイル名パターン 人がData Catalogへ登録
「注文データ」という業務上の意味 人が定義
Owner、品質基準、更新頻度 人が運用ルールを定義

つまり、初回ハーベストで4ファイルを2つの論理データ・エンティティとして管理できたのは、Data Catalogだけの働きではありません。ファイル名、フォルダ構成、Parquetスキーマ、ファイル名パターンをあらかじめ設計していたため、Data Catalogがその構造を収集し、検索可能な形へ整理できました。

● Parquetへ変換すれば、業務メタデータまで完成するわけではない

Parquetは、列名、データ型、NULL可否などのスキーマをファイル内に保持できます。そのため、CSVよりもデータ構造を明確にしやすく、今回の検証でもTIMESTAMP、BOOLEAN、INTEGER、DOUBLEなどの型がData Catalogへ反映されました。

ただし、Parquetへ変換するだけで、次のような業務上の意味まで自動的に決まるわけではありません。

  • amountは税込金額なのか、税抜金額なのか
  • 注文データは確定値なのか、処理途中の値なのか
  • どのシステムが正とされるデータを管理しているのか
  • 誰がデータ品質に責任を持つのか
  • どの時点までのデータが反映されているのか
  • 個人情報を含み、利用制限が必要なのか

Parquetなどへ構造化することは、技術メタデータを明確にするための重要な工程です。その上で、Business Glossary、タグ、Description、Data ownerUpdate frequencyなどのCustom Propertiesを使用し、業務メタデータを追加していく必要があります。Oracle公式ドキュメント

● 実運用では、データを整備する流れも必要になる

Data Catalogを活用するためには、ハーベストだけでなく、データを継続的に設計・作成・運用する流れが必要です。

  • Raw: 受け取った元ファイルをそのまま保存する領域
  • Standardized: 列名、データ型、文字コード、日付形式、命名規則などを統一する領域
  • Curated: 業務単位で統合し、品質確認や重複排除を行った利用向けデータセット
  • Data Catalog: 整備されたデータの場所と構造を収集し、検索や意味づけを行う層

ここで重要なのは、Data CatalogがRawデータをStandardizedやCuratedへ自動変換するわけではないことです。変換処理やデータ品質管理は、ETL/ELTなどのデータ・パイプラインとして別途設計します。Data Catalogは、その結果として作られたデータセットを発見・理解・管理しやすくする役割を担います。

Data Catalogは、散らかったファイルを自動的に完成されたデータセットへ変換するサービスではありません。人が設計・構造化したデータについて、場所・構造・意味を見つけやすくするサービスです。

今回の検証で増分ハーベストによるメタデータ更新は自動化できました。一方、その前提となるファイルの命名、配置、スキーマ、グループ化、業務上の意味は、継続して設計・運用する必要があります。この境界を理解しておくと、Data Catalogを導入した後に「思っていた自動化と違った」となることを避けやすくなると考えます。

■ 注意点

● ファイル名パターンはハーベスト前に割り当てる

ファイル名パターンを後から追加または変更すると、既存の論理データ・エンティティが非アクティブになる場合があります。また、増分ハーベストではファイル名パターンの式や割当ての変更を追跡しないため、変更後は完全ハーベスト(フル・ハーベスト)を実行します。

まずテスト式で実際のオブジェクト名を確認し、パターンをデータ・アセットへ割り当ててから初回ハーベストを実行すると分かりやすくなります。

● CSVの型は実データで確認する

CSVではDATE、TIMESTAMP、BOOLEAN、NULLなどがテキストや空欄として記録されます。値の揺れや欠損値によって、想定と異なる型として認識されないかを実データで確認します。

● Parquetでも複数ファイルのスキーマをそろえる

同じ論理データ・エンティティへまとめるParquetファイルは、基本的に同じスキーマで作成します。

テストデータの03_optional_schema_evolutionには3列を追加したファイルも用意しています。異なるスキーマのファイルを追加した場合の見え方は、別の検証として確認します。

■ まとめ

OCI Data Catalogを使用して、Object Storage内のCSVとParquetから技術メタデータを抽出し、日付ごとに分割されたファイルを論理データ・エンティティとして管理してみてみました。

一方で、Data Catalogがファイルを業務の意味に従って自動的に仕分けし、分析可能なデータセットへ変換してくれるわけではありません。命名規則、フォルダ構成、Parquetスキーマ、ファイル名パターン、業務上の意味などは、データを作成・運用する側で設計する必要があります。

今回、特に興味深かったのは、同じ注文データを格納していても、CSVとParquetではData Catalog上に見える型情報が大きく異なったことです。

CSVでは日時やBOOLEANがStringとして表示されました。一方、ParquetではTIMESTAMP、BOOLEAN、INTEGER、DOUBLEなどの型が反映されました。ただし、Parquet内部でDATEとして定義した列が、Data CatalogではTIMESTAMP(MILLIS, true)として表示されるなど、元ファイルの論理型とカタログ上の属性型が必ずしも1対1ではないことも確認できました。

また、日付ごとのファイルをファイル名パターンでまとめることで、CSVとParquetのファイル数が増えても、データセット単位の論理データ・エンティティとして探せる状態を維持できたので、Object Storageをデータレイクとして運用するときに分かりやすくなります。

Object Storageへファイルを置くだけでもデータレイクは作れます。しかし、Oracle DatabaseやAIから活用していくためには、どこに何のデータがあり、どのような属性を持っているのかを検索できる状態にしておくことが重要です。今回、実際にハーベストしてみたことで、データを置くところから、見つけて使える状態へ進めるためのData Catalogの役割がかなり分かりやすくなりました。

今回確認したObject Storage、Data Catalog、Resource Principal、データ・アセット作成、ハーベストの流れは、第2回でOracle Databaseマニュアルを管理するときの基盤になります。第2回では、第1回のバケットとData Catalogインスタンスを再利用することも、新しい文書専用データ・アセットを作成することもできます。

■ 次回以降

● 第2回: Oracle DatabaseマニュアルPDFの管理情報をカタログ化

第2回では、Oracle DatabaseマニュアルPDFをObject Storageへ配置します。PDFについては、[Include Unrecognized Files]を有効にしてファイル名やパスなどの基本メタデータをハーベストします。

あわせて、document_inventory.parquetに次のような文書管理情報を格納し、PDF原本と文書インベントリを組み合わせてカタログ化してみてみます。

document_id
document_family_id
product_version
document_title
official_url
object_name
object_uri
rag_enabled

Object Storage上のPDFファイル名は英数字を使用し、正式な文書名、製品バージョン、公式URLなどは文書インベントリParquetで管理します。これにより、第3回のVector Index作成でマルチバイト文字を含むファイル名がスキップされる点にも対応できる構成にします。

なお、文書インベントリParquetの各行がPDFのData Entityへ自動的に転記されるわけではありません。第2回ではCustom Propertiesを使用し、PDFのData Entityへ文書名、製品バージョン、公式URL、RAG対象フラグなどを設定します。

● 第3回: Object Storage上のPDFをSelect AI with RAGで検索

第3回では、第2回でカタログ化したPDFをData CatalogからVector Indexへ転送するのではなく、Autonomous AI Databaseが同じObject Storage上のPDFを直接読み込み、文書をチャンク分割してEmbeddingを生成し、Vector Indexへ格納します。

Data CatalogはPDFの所在や文書管理情報を管理し、Autonomous AI DatabaseはPDF本文のVector Index化と意味検索を担当します。第2回で作成するdocument_iddocument_family_idobject_nameobject_urirag_enabledを引き続き使用し、対象文書と文書インベントリの対応を確認しながら、Select AI with RAGでOracle Databaseマニュアルへ自然言語で質問してみてみます。

■ 解説

Datacatalog, Metadata,Parquetについてわかりやすく解説しています。
セールストークにもどうぞ

■ おまけ

おまけクリーンテック.png

■ 参考情報

7
1
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
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?