Aggregate and Reupdate Source

Pendahuluan

Artikel ini berangkat dari salah satu posting mengenai permasalahan yang ingin dipecahkan di Kettle, Anda bisa membaca thread tersebut di milis Pentaho-ID.

Dengan mencoba meringkas thread tersebut maka deskripsi masalahnya adalah sebagai berikut :
  • Table A memiliki beberapa field, field yang akan dipantau adalah field_1
  • Kita ambil satu grouping dari field lain dan dinamakan GROUP1 dan ambil nilai maksimum dari field_1 + 1 dan kita namakan NILAI_MAX_BARU
  • Update semua field_1 yang bernilai 0 dengan NILAI_MAX_BARU dengan pengelompokan GROUP1



Dan pada kesempatan ini, penulis akan coba menggunakan 2 solusi pendekatan :
  • Solusi "ala Kettle", yakni dengan menggunakan basis row per row
  • Pendekatan step-step SQL, yakni dengan menggunakan pendekatan set based

Contoh Data

Berikut adalah contoh data dari deskripsi yang saya terjemahkan ke tabel MySQL berikut :


Disini saya membuat satu tabel dengan nama table_a dengan field kode1, kode2 dan field_1. Script untuk membuat table dan melakukan populasi data ini bisa di-download pada bagian lampiran - akhir dari artikel ini.

Contoh Penyelesaian

Tentunya banyak sekali solusi yang bisa dihasilkan, berikut adalah salah satu alternatif penyelesaian :
  • Buat koneksi database yang terdapat tabel_a tersebut di atas
  • Masukkan step-step berikut ke dalam ruang kerja (dengan path folder pada Kettle versi 3.2)
    • Input > Table Input
    • Join > Merge Join
    • Statistics > Group By
    • Transform > Select values
    • Transform > Calculator
    • Flow > Filter rows
  • Susunlah step tersebut seperti tampak pada gambar berikut

  • Dari gambaran flow di atas idenya adalah kita mengambil data dari table_a, kemudian menduplikasi data tersebut ke dua flow lain. Satu untuk tujuan mendapatkan agregasi nilai maksimum + 1 dari field_1,sedangkan flow lainnya untuk mengambil row data yang memiliki field_1 bernilai 0. Setelah itu kedua flow tersebut di-join kembali dan akan diupdate setelah sebelumnya dilakukan penyortiran data agar tidak terlalu kompleks.

  • Pada step table_a (Table Input) masukkan kode SQL yang mengambil data dari table_a dengan pengurutan pada kode1 yang akan kita agregasi untuk mendapatkan nilai maksimum field_1


  • Pada step Group by masukkan kode1 sebagai bagian "Group field"  dan tipe "Maximum" untuk field field_1. Klik "OK"


  • Kalau terdapat warning dari step ini abaikan saja karena kita telah mengurutkan kode1 sebelumnya yang menjadi key dari step ini


  • Dari step Group By ini lanjutkan dengan step Calculator untuk menambahkan nilai maksimum dari field_1


  • Rincian step Filter rows


  • Rincian step Merge join


  • Rincian step Select values


  • Setelah semua step dikonfigurasi seperti petunjuk di atas, lakukan preview pada step Select values. Anda akan mendapatkan tampilan data seperti pada gambar berikut. Kita siap meng-update data dengan data tersebut.


  • Sekarang tambahkan step terakhir untuk mengupdate kembali tabel kita, yaitu dengan menambahkan step Update (Output > Update) setelah step Select values

  • Detil pada step Update


  • Jalankan transformasi tersebut
  • Periksalah data MySQL hasil eksekusi transformasi. Jika berjalan lancar, maka tampilan harusnya tampak seperti pada gambar berikut


  • Selesai

Contoh Penyelesaian Yang Lebih Sederhana

Jika penyelesaian di atas terlihat kompleks, sebenarnya ada cara yang lebih sederhana. Karena sebenarnya key yang dibutuhkan hanya kode1 dan filter di field1. Dengan membuat field dummy yang selalu nilainya 0 sebagai kriteria di step update, maka gambaran flow penyelesaiannya adalah sebagai berikut :


Untuk detil dari transformasi ini silahkan download file aggregate_and_reupdate_simple.ktr pada bagian lampiran artikel ini.

ċ
aggregate_and_reupdate_simple.ktr
(5k)
Webmaster PHI,
Aug 28, 2009, 9:44 AM
ċ
table_a.sql
(0k)
Webmaster PHI,
Aug 28, 2009, 7:25 AM
Comments