View a markdown version of this page

Menggabungkan data dari beberapa tabel untuk dimasukkan ke dalam satu dokumen - OpenSearch Layanan Amazon

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggabungkan data dari beberapa tabel untuk dimasukkan ke dalam satu dokumen

joinsKonfigurasi dalam plugin sumber RDS memungkinkan denormalisasi otomatis tabel relasional yang dinormalisasi menjadi dokumen tunggal. OpenSearch Saat dikonfigurasi, pipeline membaca peristiwa change data capture (CDC) dari beberapa tabel terkait dan menggabungkannya ke dalam dokumen induk menggunakan upserts berbasis skrip Painless.

Topik ini menjelaskan cara mengonfigurasi gabungan tabel di saluran konsumsi Aurora dan Amazon RDS, termasuk tipe gabungan, prasyarat, sintaks konfigurasi, pelacakan versi, dan pemecahan masalah umum.

Prasyarat

  • Pemahaman dasar konsep database relasional termasuk kunci primer, kunci asing, dan hubungan tabel.

  • Tabel dengan hubungan kunci asing (orang tua-anak).

  • Semua tabel di relations harus terdaftar ditables.include.

  • Tabel induk harus memiliki kunci utama.

  • Tabel anak harus memiliki kolom yang mereferensikan kunci utama orang tua.

  • Tabel anak harus memiliki kunci utama (child_primary_key) sendiri untuk mengidentifikasi catatan individu di upserts.

Pola bergabung yang didukung

  • Orangtua → Anak (1:1)

  • Orangtua → Anak (1:N)

  • Beberapa anak per orang tua

Contoh konfigurasi

Konfigurasi YAMAL berikut menunjukkan cara mendefinisikan hubungan tabel induk-anak untuk plugin sumber Aurora. Contoh ini mengkonfigurasi tabel induk dengan dua tabel anak menggunakan jenis gabungan yang berbeda:

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

Bergabunglah dengan tipe

one_to_one

Bidang anak diratakan pada tingkat root dokumen induk. Gunakan ketika setiap orang tua memiliki persis satu catatan anak terkait.

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_banyak

Catatan anak disimpan sebagai array bersarang dalam dokumen induk. Gunakan saat setiap orang tua dapat memiliki beberapa catatan anak terkait.

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

Struktur dokumen

ID Dokumen

OpenSearch Dokumen _id diatur ke nilai kunci utama tabel induk. Semua catatan anak untuk induk yang sama digabungkan ke dalam dokumen tunggal ini.

Pelacakan versi

version_field(default:__versions) menyimpan peta penghitung versi per tabel:

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

Versi setiap tabel berasal dari stempel waktu ekspor atau stempel waktu binlog. Ketika peristiwa ekspor atau CDC tiba, skrip Painless memeriksa apakah versi yang masuk lebih baru dari versi yang disimpan untuk tabel tertentu. Jika lebih tua, acara dilewati. Ini memastikan:

  • Pemrosesan idempoten — acara yang diputar ulang diabaikan dengan aman.

  • Pembuatan versi independen—pembaruan pesanan tidak mengganggu pembaruan item.

  • Keamanan bersamaan — beberapa sisipan anak untuk induk yang sama ditangani dengan benar.

_versi dokumen

OpenSearch _versionBidang bertambah dengan setiap peningkatan yang berhasil. Untuk dokumen dengan 1 orang tua+N item+1 catatan pengiriman, _version = N + 2.

Batasan

  • Single-level bergabung saja—orang tua → anak. Multi-level (orang tua → anak → cucu) tidak didukung.

  • Satu tabel induk per pipa. Semua tabel anak bergabung dengan orang tua yang sama.

  • Tabel anak tidak dapat dimiliki oleh banyak orang tua dalam pipeline yang sama.

  • max_child_recordsmembatasi ukuran array untuk one_to_many bergabung. Catatan di luar batas ini dijatuhkan.

Konflik nama bidang

Untuk one_to_one bergabung, bidang anak diratakan pada tingkat akar. Jika tabel anak memiliki kolom dengan nama yang sama dengan kolom induk, nilai anak menimpa nilai induk. Gunakan nama kolom yang berbeda di seluruh tabel induk dan one_to_one anak.

Untuk one_to_many gabungan, bidang anak bersarang di dalam array yang dinamai tabel anak, jadi konflik tidak menjadi masalah.

Pemecahan masalah

Dokumen yang hilang catatan anak
  • Periksa __versions dokumen. Jika versi tabel anak hilang, peristiwa turunan belum diproses.

  • Verifikasi pipa aktif dan changeEventsProcessed metriknya bukan nol.

Dokumen tidak muncul di OpenSearch
  • Periksa apakah catatan induk ada di tabel sumber.

  • Verifikasi tables.include daftar berisi semua tabel yang diperlukan.

  • Periksa log pipa untuk kegagalan konsumsi dan masalah konfigurasi:. /aws/vendedlogs/pipeline-log-group