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
relationsharus 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
_iddiatur 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 untukone_to_manybergabung. 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
__versionsdokumen. Jika versi tabel anak hilang, peristiwa turunan belum diproses. -
Verifikasi pipa aktif dan
changeEventsProcessedmetriknya bukan nol.
-
- Dokumen tidak muncul di OpenSearch
-
-
Periksa apakah catatan induk ada di tabel sumber.
-
Verifikasi
tables.includedaftar berisi semua tabel yang diperlukan. -
Periksa log pipa untuk kegagalan konsumsi dan masalah konfigurasi:.
/aws/vendedlogs/pipeline-log-group
-