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
relationsdevem 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
_versioncampo é 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 paraone_to_manyjunçõ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
__versionso 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
changeEventsProcessedmé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.includelista 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
-