Pemrosesan perbedaan yang efisien antara input data dan basis data

8

Saya memiliki dataset input yang catatannya akan ditambahkan ke database yang ada. Sebelum ditambahkan, data akan melalui proses yang berat dan intensif waktu. Saya ingin menyaring catatan dari dataset input yang sudah ada dalam database untuk mengurangi waktu pemrosesan.

Perbedaan antara input dan database diilustrasikan di sini: Perbedaan Input dan Database

Ini gambaran dari jenis proses yang saya lihat. Data input pada akhirnya akan dimasukkan ke dalam database. Alur Kerja Pemrosesan Input

Solusi saya saat ini melibatkan menggunakan transformer Matcher pada basis data dan input gabungan, kemudian memfilter hasil NotMatched menggunakan FeatureTypeFilter untuk mempertahankan hanya catatan input.

Apakah ada cara yang lebih efisien untuk mendapatkan perbedaan fitur?

rovyko
sumber
1
apakah Anda menggunakan database oracle? Anda bisa mendapatkan database untuk melakukan pekerjaan antara tabel delta menggunakan MINUS stackoverflow.com/questions/2293092/…
Mapperz
2
Daripada membaca semuanya dari database, Anda mungkin ingin mencoba menggunakan a SQLexecutor. Jika atribut _matched_records adalah 0 pada inisiator maka itu merupakan add
MickyT

Jawaban:

4

Jika Anda memiliki karakteristik basis data yang ditunjukkan oleh diagram. Input kecil, tumpang tindih kecil, target besar. Maka jenis ruang kerja berikut ini dapat bekerja cukup efisien, meskipun itu akan melakukan beberapa kueri terhadap database.

masukkan deskripsi gambar di sini

Jadi untuk setiap fitur baca dari permintaan input untuk fitur yang cocok dalam database. Pastikan ada indeks yang sesuai di tempat. Uji atribut _matched_records untuk 0, lakukan pemrosesan dan kemudian masukkan ke dalam database.

MickyT
sumber
Saya menemukan ini menjadi solusi tercepat. Saya menduga karena membatasi jumlah data yang diambil dari database ke FME dan membuat pemrosesan SQL-side.
rovyko
4

Saya tidak menggunakan FME, tetapi saya memiliki tugas pemrosesan serupa yang mengharuskan penggunaan output dari pekerjaan pemrosesan 5 jam untuk mengidentifikasi tiga kasus pemrosesan yang mungkin untuk database paralel di tautan jaringan bandwidth rendah:

  • Fitur baru yang akan ditambahkan
  • Fitur yang ada diperbarui
  • Exisitng fitur yang akan dihapus

Karena saya memang memiliki jaminan bahwa semua fitur akan mempertahankan nilai ID unik di antara lintasan, saya dapat:

  1. Jalankan skrip pemrosesan yang menghasilkan tabel pasangan {uID, checksum} di seluruh kolom penting dalam tabel yang diperbarui
  2. Menggunakan pasangan {uID, checksum} yang dihasilkan dalam iterasi sebelumnya untuk mengirimkan pembaruan ke tabel target dengan baris di tabel yang diperbarui di mana uID berada di subquery di mana checksum tidak cocok
  3. Mengirimkan sisipan dari tabel yang diperbarui yang diindikasikan subquery gabungan luar memiliki UID yang tidak cocok, dan
  4. Menransmisikan daftar uID untuk menghapus fitur di tabel eksternal yang ditunjukkan subquery gabungan luar tidak lagi memiliki uID yang cocok di tabel saat ini
  5. Simpan pasangan {uID, checksum} saat ini untuk operasi hari berikutnya

Pada database eksternal, saya hanya perlu memasukkan fitur baru, memperbarui delta, mengisi tabel sementara dari UID yang dihapus, dan menghapus fitur-fitur DI dalam tabel hapus.

Saya dapat mengotomatiskan proses ini untuk menyebarkan ratusan perubahan harian ke tabel baris 10-juta dengan dampak minimal ke tabel produksi, menggunakan runtime harian kurang dari 20 menit. Itu berjalan dengan biaya administrasi minimum selama beberapa tahun tanpa kehilangan sinkronisasi.

Meskipun tentu saja mungkin untuk melakukan perbandingan N di seluruh baris M, menggunakan digest / checksum adalah cara yang sangat menarik untuk menyelesaikan tes "ada" dengan biaya yang jauh lebih rendah.

Vince
sumber
4

Gunakan featureMerger, bergabung dan dikelompokkan berdasarkan bidang umum dari DATABASE DAN DATA INPUT. masukkan deskripsi gambar di sini

Jorge Vidinha
sumber