View a markdown version of this page

Unir datos de varias tablas para incluirlos en un solo documento - OpenSearch Servicio Amazon

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Unir datos de varias tablas para incluirlos en un solo documento

La joins configuración del complemento fuente de RDS permite la desnormalización automática de tablas relacionales normalizadas en documentos únicos. OpenSearch Cuando se configura, la canalización lee los eventos de captura de datos de cambios (CDC) de varias tablas relacionadas y los fusiona en un documento principal mediante secuencias de comandos de Painless.

En este tema se explica cómo configurar las uniones de tablas en las canalizaciones de ingestión de Aurora y Amazon RDS, incluidos los tipos de uniones, los requisitos previos, la sintaxis de configuración, el seguimiento de versiones y la solución de problemas comunes.

Requisitos previos

  • Comprensión básica de los conceptos de bases de datos relacionales, incluidas las claves principales, las claves externas y las relaciones entre tablas.

  • Tablas con relaciones de clave externa (padre-hijo).

  • Todas las tablas incluidas relations deben figurar en. tables.include

  • La tabla principal debe tener una clave principal.

  • Las tablas secundarias deben tener una columna que haga referencia a la clave principal de la tabla principal.

  • Las tablas secundarias deben tener su propia clave principal (child_primary_key) para identificar los registros individuales de las upserts.

Patrones de unión compatibles

  • Padre → Hijo (1:1)

  • Padre → Niño (1:N)

  • Varios hijos por padre

Configuración de ejemplo

La siguiente configuración de YAML muestra cómo definir las relaciones de las tablas padre-secundaria para el complemento fuente Aurora. En este ejemplo, se configura una tabla principal con dos tablas secundarias que utilizan diferentes tipos de unión:

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

Tipos de combinación

uno a uno

Los campos secundarios se aplanan en el nivel raíz del documento principal. Úselo cuando cada padre tenga exactamente un registro secundario relacionado.

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" }
de uno a muchos

Los registros secundarios se almacenan como una matriz anidada en el documento principal. Úselo cuando cada padre pueda tener varios registros secundarios relacionados.

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} ] }

Estructura del documento

ID del documento

El OpenSearch documento _id se establece en el valor de la clave principal de la tabla principal. Todos los registros secundarios del mismo elemento principal se combinan en este único documento.

Seguimiento de versiones

El version_field (predeterminado:__versions) almacena un mapa de contadores de versiones por tabla:

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

La versión de cada tabla se deriva de la marca de tiempo de exportación o de la marca de tiempo binlog. Cuando llega un evento de exportación o de CDC, el script Painless comprueba si la versión entrante es más reciente que la versión almacenada para esa tabla específica. Si es anterior, se omite el evento. Esto garantiza lo siguiente:

  • Procesamiento idempotente: los eventos reproducidos se ignoran de forma segura.

  • Control de versiones independiente: la actualización de un pedido no interfiere con las actualizaciones de los artículos.

  • Seguridad simultánea: varios encartes secundarios para el mismo progenitor se gestionan correctamente.

_versión del documento

El OpenSearch _version campo se incrementa con cada inserción correcta. En el caso de un documento principal + N artículos + 1 registro de envío, _version = N + 2.

Limitaciones

  • Single-level solo se une: padre → hijo. Multi-level (padre → hijo → nieto) no es compatible.

  • Una tabla principal por canalización. Todas las tablas secundarias se unen a la misma tabla principal.

  • Las tablas secundarias no pueden pertenecer a varios padres en la misma canalización.

  • max_child_recordslimita el tamaño de la matriz para las one_to_many uniones. Los registros que superen este límite se eliminan.

Conflictos de nombres de campo

En el one_to_one caso de las uniones, los campos secundarios se aplanan en el nivel raíz. Si una tabla secundaria tiene una columna con el mismo nombre que una columna principal, el valor secundario sobrescribe el valor principal. Utilice nombres de columna distintos en las tablas principales y one_to_one secundarias.

En el caso de las one_to_many uniones, los campos secundarios se anidan dentro de una matriz que lleva el nombre de la tabla secundaria, por lo que los conflictos no son un problema.

Resolución de problemas

En los documentos faltan registros secundarios
  • __versionsRegistre el documento. Si falta la versión de una tabla secundaria, significa que los eventos secundarios aún no se han procesado.

  • Verifica que la canalización esté activa y que la changeEventsProcessed métrica no sea cero.

Los documentos no aparecen en OpenSearch
  • Compruebe si el registro principal existe en la tabla de origen.

  • Compruebe que la tables.include lista contenga todas las tablas obligatorias.

  • Compruebe los registros de canalización para ver si hay errores de ingesta y problemas de configuración:/aws/vendedlogs/pipeline-log-group.