View a markdown version of this page

從多個資料表聯結資料以擷取至一個文件 - Amazon OpenSearch Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

從多個資料表聯結資料以擷取至一個文件

RDS 來源外掛程式中的joins組態可將標準化關聯式資料表自動取消標準化為單一 OpenSearch 文件。設定後,管道會從多個相關資料表讀取變更資料擷取 (CDC) 事件,並使用 Painless 指令碼型 upserts 將其合併至父文件。

本主題說明如何在 Aurora 和 Amazon RDS 擷取管道中設定資料表聯結,包括聯結類型、先決條件、組態語法、版本追蹤和疑難排解常見問題。

先決條件

  • 對關聯式資料庫概念的基本了解,包括主索引鍵、外部索引鍵和資料表關係。

  • 具有外部金鑰關係的資料表 (父子)。

  • 中的所有資料表relations都必須列在 中tables.include

  • 父資料表必須具有主索引鍵。

  • 子資料表必須具有參考父主索引鍵的資料欄。

  • 子資料表必須擁有自己的主索引鍵 (child_primary_key),以識別 upsert 中的個別記錄。

支援的聯結模式

  • 父項 → 子項 (1:1)

  • 父項 → 子項 (1:N)

  • 每個父系有多個子系

範例組態

下列 YAML 組態顯示如何定義 Aurora 來源外掛程式的父子資料表關係。此範例使用不同的聯結類型,設定具有兩個子資料表的父資料表:

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

子欄位會在父文件的根層級扁平化。當每個父系只有一個相關的子記錄時使用 。

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設定為父資料表主索引鍵的值。相同父系的所有子項記錄都會合併到此單一文件中。

版本追蹤

version_field (預設:__versions) 會儲存每個資料表版本計數器的映射:

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

每個資料表的版本衍生自匯出時間戳記或 binlog 時間戳記。匯出或 CDC 事件送達時,無痕指令碼會檢查傳入版本是否比該特定資料表的預存版本更新。如果較舊,則會略過事件。這可確保:

  • 等冪處理 - 系統會安全地忽略重播的事件。

  • 獨立版本控制 - 訂單更新不會影響項目更新。

  • 並行安全性 - 正確處理相同父項的多個子插入。

文件 _version

OpenSearch _version 欄位會隨著每個成功的 upsert 遞增。對於具有 1 個父項 + N 個項目 + 1 個運送記錄的文件, _version = N + 2。

限制

  • 僅限單一層級聯結 - 父 → 子項。不支援多層級 (父 → 子 → 孫子)。

  • 每個管道一個父資料表。所有子資料表都會聯結至相同的父系。

  • 子資料表不能屬於同一管道中的多個父系。

  • max_child_records 會限制one_to_many聯結的陣列大小。超過此限制的記錄會被捨棄。

欄位名稱衝突

對於one_to_one聯結,子欄位會在根層級扁平化。如果子資料表具有與父資料欄同名的資料欄,則子值會覆寫父值。在父資料表和one_to_one子資料表之間使用不同的資料欄名稱。

對於one_to_many聯結,子欄位會巢狀在以子資料表命名的陣列中,因此衝突不是問題。

疑難排解

文件遺失子記錄
  • __versions 檢查 文件。如果缺少子資料表的版本,則子事件尚未處理。

  • 確認管道處於作用中狀態,且changeEventsProcessed指標為非零。

未出現在 OpenSearch 的文件
  • 檢查來源資料表中是否存在父系記錄。

  • 確認tables.include清單包含所有必要的資料表。

  • 檢查管道日誌是否有擷取失敗和組態問題:/aws/vendedlogs/pipeline-log-group