DataWorks menyediakan node do-while, yang menerapkan logika loop "eksekusi dulu, lalu periksa". Node ini ideal ketika Anda perlu mengulang serangkaian task hingga suatu kondisi dinamis terpenuhi, seperti polling untuk memeriksa keberadaan file atau memproses data secara batch hingga sumbernya habis. Anda dapat mengatur alur task di dalam badan loop dan menggunakan node End khusus untuk mengontrol keluar dari loop.
Kasus penggunaan
Dalam pengembangan data, node do-while menyederhanakan desain workflow yang perlu mengeksekusi task berulang kali berdasarkan suatu kondisi. Kasus penggunaan umum meliputi:
Polling API: Panggil API berulang kali hingga mengembalikan status tertentu, seperti
SUCCESS, atau hingga data respons memenuhi persyaratan Anda.Pemeriksaan kesiapan data: Tunggu hingga file atau partisi data hulu selesai dibuat. Loop memeriksa keberadaan data pada setiap iterasi dan keluar begitu data tersedia, lalu memicu task hilir.
Pemrosesan data batch: Proses daftar item, seperti nama tabel atau partisi tanggal, yang disediakan oleh node hulu seperti assignment node. Node do-while melakukan iterasi melalui daftar tersebut, memproses satu item dalam satu waktu hingga daftarnya habis.
Sinkronisasi status: Periksa status layanan eksternal secara berulang. Begitu status layanan berubah menjadi keadaan yang diinginkan, seperti "Available" atau "Complete", loop berhenti dan memicu workflow sinkronisasi atau pemrosesan data berikutnya.
Persyaratan
-
Persyaratan versi: Fitur ini hanya tersedia di DataWorks Edisi Standar dan versi yang lebih baru.
-
Persyaratan izin: RAM user Anda harus menjadi anggota ruang kerja target dengan peran Development atau Workspace Manager. Untuk informasi selengkapnya, lihat Tambahkan anggota ke ruang kerja.
Cara kerja
Node do-while berfungsi sebagai kontainer loop berdasarkan mekanisme "eksekusi dulu, lalu periksa".
node awal → badan loop (mengeksekusi tugas) →
node akhir (mengevaluasi kondisi)
Mulai dan eksekusi: Loop dimulai dari
Node Start, dan semua task di dalam badan loop dieksekusi minimal satu kali.Evaluasi kondisi: Setelah badan loop selesai,
Node End dijalankan. Anda menulis logika kondisional di node ini.Keputusan loop:
Jika
Node End menghasilkan string True, iterasi baru dimulai.Jika
Node End menghasilkan string False, loop dihentikan, dan seluruh eksekusi node do-while dianggap berhasil.
Fitur utama: Badan loop selalu dieksekusi minimal satu kali, terlepas dari kondisi awal.
Komponen node
Klik ganda node do-while untuk membuka kanvas internalnya, yang terdiri dari tiga bagian utama:
Node Start: Titik masuk loop. Tidak dapat diedit atau dihapus.Badan loop: Kanvas yang dapat dikustomisasi untuk task Anda. Anda dapat mengklik Create Internal Node untuk menambahkan berbagai jenis node internal, seperti Shell, SQL, dan Python, guna membentuk proses bisnis yang dapat diulang.
Node End: Node pengambil keputusan loop. Ini adalah assignment node yang menggunakan ODPS SQL, Shell, atau Python untuk menghasilkan string TrueatauFalse. String ini menentukan apakah loop dilanjutkan.
Variabel bawaan
Di dalam badan loop dan Node End node do-while, Anda dapat menggunakan variabel bawaan berikut untuk mengakses status loop saat ini dan data masukan:
Variabel | Deskripsi |
Variabel bawaan sistem | |
| Nomor iterasi saat ini, dimulai dari 1. |
| Offset iterasi saat ini, dimulai dari 0. Nilainya sama dengan |
Digunakan bersama assignment node | |
| Mengembalikan seluruh set hasil dari node hulu, yang biasanya berupa array dua dimensi. |
| Mengembalikan jumlah baris (elemen) dalam set hasil. |
| Mengambil baris data yang sedang diproses dalam iterasi saat ini dan mengembalikannya sebagai string yang dipisahkan koma, seperti |
| Mengembalikan nilai pada baris |
Contoh:${dag.input[0][1]}mengekstrak nilai"beijing"dari kolom kedua baris pertama.
Batasan
Persyaratan edisi: Fitur ini hanya tersedia di DataWorks Edisi Standar dan versi yang lebih baru.
Batas iterasi: Jumlah maksimum iterasi default adalah 128, dan dapat disesuaikan hingga maksimal 1.024. Melebihi batas ini menyebabkan task gagal.
Model eksekusi: Node ini menggunakan model eksekusi serial, artinya setiap iterasi harus selesai sebelum iterasi berikutnya dimulai.
Batasan debugging: Anda tidak dapat menjalankan dan menguji node do-while secara langsung di DataStudio. Anda harus terlebih dahulu mempublikasikan workflow, lalu menggunakan fitur Backfill Data di Operation Center untuk memverifikasi perilakunya.
Ketergantungan data: Jika loop bergantung pada assignment node hulu, pastikan Anda melakukan backfill data mulai dari node hulu untuk memastikan alur data lengkap.
Kontrol alur: Jika Anda menggunakan branch node di dalam badan loop, pastikan semua cabang akhirnya bertemu di merge node untuk mencegah workflow terputus.
Prosedur: Membuat task loop sederhana
Contoh ini menunjukkan cara membuat task yang melakukan loop lima kali. Pada setiap iterasi, task mencetak nomor loop saat ini.
Langkah 1: Konfigurasikan badan loop
Buat node
do-whiledi workflow Anda.Klik ganda node tersebut untuk membuka kanvas internalnya. Di area badan loop, klik Create Internal Node, pilih Shell, dan beri nama node tersebut
print_loop_times.Klik kanan node Shell dan pilih Open Node.
Di editor kode, masukkan perintah berikut:
# Gunakan variabel bawaan ${dag.loopTimes} untuk mendapatkan nomor loop saat ini echo "This is loop number: ${dag.loopTimes}"Klik ikon simpan untuk menyimpan perubahan Anda.
Langkah 2: Tentukan kondisi keluar
Kembali ke kanvas internal do-while. Klik kanan
End node, lalu pilih Open Node.Ubah bahasa ke Python.
Masukkan kode Python berikut:
# Jika jumlah loop kurang dari 5, lanjutkan loop; jika tidak, keluar. if ${dag.loopTimes} < 5: print True else: print FalseSimpan Node End.
Langkah 3: Publikasikan, jalankan, dan verifikasi
Kembali ke kanvas workflow utama dan klik tombol Publish di bilah alat untuk mempublikasikan seluruh workflow.
Buka Operation Center dan temukan node
do-while.Klik kanan node tersebut dan pilih Backfill Data > Current Node untuk memulai uji coba.
Setelah instans berhasil dijalankan, klik kanan lagi dan pilih View Internal Nodes.
Tinjau catatan lima iterasi. Buka salah satu iterasi, misalnya iterasi kelima. Klik kanan instans internal
print_loop_timesdan pilih View Runtime Log. Anda akan melihat output berikut:This is loop number: 5
Kasus penggunaan lanjutan: Memproses daftar data
Pola umum dan praktis adalah menggunakan node do-while untuk melakukan iterasi dan memproses set data yang dihasilkan oleh assignment node hulu. Dalam skenario ini, assignment node ODPS SQL hulu mengambil dua baris informasi pengguna, dan node do-while memproses setiap baris.
Langkah 1: Konfigurasikan assignment node
Buat assignment node (misalnya, bernama
assign_sql_data) dan tetapkan sebagai dependensi hulu nodedo-while.Di node tersebut, gunakan ODPS SQL untuk mengambil data:
SELECT 'user_A', 'beijing' UNION ALL SELECT 'user_B', 'shanghai';Simpan node tersebut. Parameter
outputsakan berisi array dua dimensi dengan dua baris data.
Langkah 2: Konfigurasikan node do-while
Di panel Scheduling Configurations di sisi kanan node
do-while, temukan bagian Input Parameters.Klik Add dan konfigurasikan parameter berikut:
Name:
input(dapat dikustomisasi)Value Source: Pilih
assign_sql_data.outputs
Buat node Shell baru di badan loop node
do-whiledan masukkan skrip berikut untuk memproses baris saat ini:# Ambil baris data yang sedang diproses dalam iterasi saat ini echo "Processing data row: ${dag.input[${dag.offset}]}"Buka
End node dan gunakan Python untuk mengatur kondisi keluar:# Lanjutkan loop jika masih ada baris data yang perlu diproses. if ${dag.loopTimes} < ${dag.input.length}: print True else: print FalsePublish workflow dan, di Operation Center, lakukan backfill data mulai dari node
assign_sql_datauntuk memastikan data mengalir dengan benar ke dalam loop.
Setelah eksekusi berhasil, Anda dapat memeriksa log waktu proses untuk melihat bahwa dua iterasi tersebut masing-masing memproses "user_A,beijing" dan "user_B,shanghai".
Lampiran: Perbandingan node do-while dan for-each
Fitur | Node do-while | For-each node |
Logika inti | Berdasarkan kondisi: Mengulang eksekusi hingga kondisi tidak lagi terpenuhi. | Berdasarkan data: Dieksekusi sekali untuk setiap elemen dalam daftar input. |
Jumlah iterasi | Tidak pasti, tergantung kapan kondisi terpenuhi. | Pasti, sama dengan jumlah elemen dalam daftar input. |
Jaminan eksekusi | Dieksekusi minimal satu kali, bahkan jika kondisi awal tidak terpenuhi. | Jika daftar input kosong, sama sekali tidak dieksekusi. |
Kasus penggunaan | Polling, menunggu, pemeriksaan status, dan pemrosesan batch hingga sumber habis. | Pemrosesan batch daftar yang diketahui, seperti sinkronisasi kumpulan tabel atau memproses beberapa partisi. |
Metode kontrol | Node End menghasilkan | Otomatis berakhir setelah melakukan iterasi melalui semua elemen. |