View a markdown version of this page

複数のテーブルからのデータを結合して 1 つのドキュメントに取り込む - Amazon OpenSearch Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

複数のテーブルからのデータを結合して 1 つのドキュメントに取り込む

RDS ソースプラグインjoinsの設定により、正規化されたリレーショナルテーブルを単一の OpenSearch ドキュメントに自動的に非正規化できます。設定すると、パイプラインは複数の関連テーブルから変更データキャプチャ (CDC) イベントを読み取り、Painless スクリプトベースのアップサートを使用して親ドキュメントにマージします。

このトピックでは、結合タイプ、前提条件、設定構文、バージョン追跡、一般的な問題のトラブルシューティングなど、Aurora および Amazon RDS 取り込みパイプラインでテーブル結合を設定する方法について説明します。

前提条件

  • プライマリキー、外部キー、テーブル関係など、リレーショナルデータベースの概念に関する基本的な理解。

  • 外部キー関係 (親子) を持つテーブル。

  • のすべてのテーブルは、 にリストrelationsされている必要がありますtables.include

  • 親テーブルにはプライマリキーが必要です。

  • 子テーブルには、親のプライマリキーを参照する列が必要です。

  • 子テーブルには、アップサート内の個々のレコードを識別するための独自のプライマリキー (child_primary_key) が必要です。

サポートされている結合パターン

  • 親 → 子 (1:1)

  • 親 → 子 (1:N)

  • 親ごとに複数の子

設定例

次の YAML 設定は、Aurora ソースプラグインの親子テーブル関係を定義する方法を示しています。この例では、異なる結合タイプを使用して 2 つの子テーブルを持つ親テーブルを設定します。

version: "2" aurora-joins-pipeline: source: rds: db_identifier: "my-aurora-cluster" engine: "aurora-mysql" database: "my_database" tables: include: - "parent_table" - "child_table_1" - "child_table_2" s3_bucket: "my-pipeline-bucket" s3_region: "us-east-1" s3_prefix: "rds-export" export: kms_key_id: "my-kms-key-id" iam_role_arn: "arn:aws:iam::123456789012:role/my-export-role" stream: true aws: sts_role_arn: "arn:aws:iam::123456789012:role/my-pipeline-role" region: "us-east-1" authentication: username: ${{aws_secrets:secret:username}} password: ${{aws_secrets:secret:password}} joins: version_field: "__versions" relations: - parent: "parent_table" child: "child_table_1" parent_key: "id" child_key: "parent_id" child_primary_key: "child_id" join_type: "one_to_many" max_child_records: 100 - parent: "parent_table" child: "child_table_2" parent_key: "id" child_key: "parent_id" child_primary_key: "child_id" join_type: "one_to_one" sink: - opensearch: hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"] index: "my-joined-index" document_id: "${getMetadata(\"primary_key\")}" action: "${getMetadata(\"opensearch_action\")}" aws: sts_role_arn: "arn:aws:iam::123456789012:role/my-pipeline-role" region: "us-east-1" extension: aws: secrets: secret: secret_id: "arn:aws:secretsmanager:us-east-1:123456789012:secret:my-db-secret" region: "us-east-1" sts_role_arn: "arn:aws:iam::123456789012:role/my-pipeline-role" refresh_interval: PT1H

結合の種類

one_to_one

子フィールドは親ドキュメントのルートレベルでフラット化されます。各親に関連する子レコードが 1 つだけある場合に使用します。

Parent table: orders (order_id, customer_name, total) Child table: shipping (shipping_id, order_id, tracking_number, carrier) Result document: { "order_id": 1, "customer_name": "Alice", "total": 299.99, "shipping_id": "1", "tracking_number": "TRK-1", "carrier": "FedEx" }
one_to_many

子レコードは、ネストされた配列として親ドキュメントに保存されます。各親が複数の関連する子レコードを持つことができる場合に使用します。

Parent table: orders (order_id, customer_name, total) Child table: order_items (item_id, order_id, product_name, quantity, price) Result document: { "order_id": 1, "customer_name": "Alice", "total": 299.99, "order_items": [ {"item_id": 10, "product_name": "Keyboard", "quantity": 1, "price": 149.99}, {"item_id": 11, "product_name": "Mouse", "quantity": 1, "price": 29.99} ] }

ドキュメント構造

ドキュメント ID

OpenSearch ドキュメント_idは、親テーブルのプライマリキーの値に設定されます。同じ親のすべての子レコードは、この 1 つのドキュメントにマージされます。

バージョン追跡

version_field (デフォルト: __versions) は、テーブルごとのバージョンカウンターのマップを保存します。

"__versions": { "orders": 12345678901, "order_items": 12345678902, "shipping": 12345678903 }

各テーブルのバージョンは、エクスポートタイムスタンプまたはバイナリログタイムスタンプから算出されます。エクスポートまたは CDC イベントが到着すると、Painless スクリプトは、受信バージョンがその特定のテーブルのストアドバージョンよりも新しいかどうかを確認します。古い場合、イベントはスキップされます。これにより、以下が保証されます。

  • べき等処理 — 再生されたイベントは安全に無視されます。

  • 独立したバージョニング — 注文の更新はアイテムの更新を妨げません。

  • 同時安全性 — 同じ親の複数の子挿入が正しく処理されます。

ドキュメント _version

OpenSearch _versionフィールドは、アップサートが成功するたびに増加します。1 つの親 + N 項目 + 1 つの配送レコードを持つドキュメントの場合、 _version = N + 2。

制限事項

  • 単一レベルの結合のみ — 親 → 子。マルチレベル (親 → 子 → 孫) はサポートされていません。

  • パイプラインごとに 1 つの親テーブル。すべての子テーブルは同じ親に結合されます。

  • 子テーブルは、同じパイプライン内の複数の親に属すことはできません。

  • max_child_recordsone_to_many結合の配列サイズを制限します。この制限を超えるレコードは削除されます。

フィールド名の競合

one_to_one 結合の場合、子フィールドはルートレベルでフラット化されます。子テーブルに親列と同じ名前の列がある場合、子値は親値を上書きします。親テーブルとone_to_one子テーブルで個別の列名を使用します。

one_to_many 結合の場合、子フィールドは子テーブルにちなんで という名前の配列内にネストされるため、競合は問題ではありません。

トラブルシューティング

欠落している子レコードのドキュメント
  • ドキュメント__versionsを確認します。子テーブルのバージョンがない場合、子イベントはまだ処理されていません。

  • パイプラインがアクティブで、changeEventsProcessedメトリクスがゼロ以外であることを確認します。

OpenSearch に表示されないドキュメント
  • 親レコードがソーステーブルに存在するかどうかを確認します。

  • tables.include リストに必要なすべてのテーブルが含まれていることを確認します。

  • パイプラインログで取り込みの失敗と設定の問題を確認します: /aws/vendedlogs/pipeline-log-group