View a markdown version of this page

Unindo dados de várias tabelas para ingerir em um único documento - OpenSearch Serviço Amazon

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Unindo dados de várias tabelas para ingerir em um único documento

A joins configuração no plug-in de origem do RDS permite a desnormalização automática de tabelas relacionais normalizadas em documentos únicos. OpenSearch Quando configurado, o pipeline lê eventos de captura de dados de alteração (CDC) de várias tabelas relacionadas e os mescla em um documento principal usando upserts baseados em script Painless.

Este tópico explica como configurar junções de tabelas nos pipelines de ingestão do Aurora e do Amazon RDS, incluindo tipos de junção, pré-requisitos, sintaxe de configuração, controle de versões e solução de problemas comuns.

Pré-requisitos

  • Compreensão básica dos conceitos de banco de dados relacional, incluindo chaves primárias, chaves estrangeiras e relacionamentos de tabelas.

  • Tabelas com relações de chave estrangeira (pai-filho).

  • Todas as tabelas relations devem estar listadas emtables.include.

  • A tabela principal deve ter uma chave primária.

  • As tabelas secundárias devem ter uma coluna referenciando a chave primária do pai.

  • As tabelas secundárias devem ter sua própria chave primária (child_primary_key) para identificar registros individuais em upserts.

Padrões de junção suportados

  • Pai → Filho (1:1)

  • Pai → Filho (1:N)

  • Vários filhos por pai

Exemplo de configuração

A configuração YAML a seguir mostra como definir relacionamentos de tabela pai-filho para o plug-in de origem do Aurora. Este exemplo configura uma tabela principal com duas tabelas secundárias usando diferentes tipos de junção:

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 união

um_para-um

Os campos secundários são nivelados no nível raiz do documento principal. Use quando cada pai tiver exatamente um registro filho 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" }
um_para_muitos

Os registros secundários são armazenados como uma matriz aninhada no documento principal. Use quando cada pai puder ter vários registros infantis 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} ] }

Estrutura do documento

ID do documento

O OpenSearch documento _id é definido com o valor da chave primária da tabela principal. Todos os registros secundários do mesmo pai são mesclados nesse único documento.

Acompanhamento de versões

O version_field (padrão:__versions) armazena um mapa dos contadores de versão por tabela:

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

A versão de cada tabela é derivada do timestamp de exportação ou do timestamp do binlog. Quando chega um evento de exportação ou CDC, o script Painless verifica se a versão de entrada é mais recente do que a versão armazenada dessa tabela específica. Se for mais antigo, o evento será ignorado. Isso garante:

  • Processamento idempotente — eventos repetidos são ignorados com segurança.

  • Controle de versão independente — uma atualização do pedido não interfere nas atualizações do item.

  • Segurança simultânea — vários encartes infantis para o mesmo pai são manuseados corretamente.

_versão do documento

O OpenSearch _version campo é incrementado com cada reviravolta bem-sucedida. Para um documento com 1 pai + N itens + 1 registro de remessa, _version = N + 2.

Limitações

  • Single-level só se junta — pai → filho. Multi-level (pai → filho → neto) não é suportado.

  • Uma tabela principal por pipeline. Todas as tabelas secundárias se juntam ao mesmo pai.

  • As tabelas secundárias não podem pertencer a vários pais no mesmo pipeline.

  • max_child_recordslimita o tamanho da matriz para one_to_many junções. Registros além desse limite são descartados.

Conflitos de nome de campo

Para one_to_one junções, os campos secundários são nivelados no nível da raiz. Se uma tabela secundária tiver uma coluna com o mesmo nome da coluna principal, o valor secundário substituirá o valor principal. Use nomes de colunas distintos nas tabelas principal e one_to_one secundária.

Para one_to_many junções, os campos secundários são aninhados dentro de uma matriz com o nome da tabela secundária, portanto, os conflitos não são um problema.

Solução de problemas

Documentos que faltam registros infantis
  • Verifique __versions o documento. Se a versão de uma tabela secundária estiver ausente, os eventos secundários ainda não foram processados.

  • Verifique se o pipeline está ativo e se a changeEventsProcessed métrica é diferente de zero.

Documentos que não aparecem em OpenSearch
  • Verifique se o registro principal existe na tabela de origem.

  • Verifique se a tables.include lista contém todas as tabelas necessárias.

  • Verifique os registros do pipeline quanto a falhas de ingestão e problemas de configuração:/aws/vendedlogs/pipeline-log-group.