Node do-while merupakan implementasi pola alur kendali do-while dari pemrograman dalam DataWorks. Node ini mengeksekusi alur kerja internal secara berulang hingga node end mengembalikan nilai False. Gunakan node do-while untuk menjalankan loop, melakukan iterasi atas set hasil dari node assignment, atau menerapkan logika pengulangan kondisional dalam alur kerja penjadwalan Anda.
Cara kerja
Saat node do-while dijalankan, alur kerja internalnya dieksekusi dalam loop berurutan—eksekusi paralel tidak didukung, sehingga setiap loop harus selesai sebelum loop berikutnya dimulai. Di akhir setiap loop, node end mengevaluasi suatu kondisi dan mengembalikan True (lanjutkan loop) atau False (keluar). Batas maksimum loop adalah 1.024 iterasi; jika batas tersebut tercapai, node end secara otomatis mengembalikan False.
Alur kerja internal selalu dimulai dengan node start dan diakhiri dengan node end. Di antara keduanya, Anda dapat menempatkan node task apa pun yang dibutuhkan oleh alur kerja Anda. DataWorks menyediakan variabel bawaan sehingga node task dan node end dapat membaca status loop (jumlah loop saat ini, offset) serta data yang diteruskan oleh node assignment leluhur.
Batasan
| Batasan | Detail |
|---|---|
| Edisi | Edisi Standar atau lebih tinggi. Lihat Perbedaan antar edisi DataWorks. |
| Jumlah loop maksimum | 1.024. Jika melebihi batas ini, node end secara otomatis mengembalikan False. |
| Eksekusi paralel | Tidak didukung. Setiap loop harus selesai sebelum loop berikutnya dimulai. |
| Pengujian | Di ruang kerja mode standar, Anda tidak dapat menguji node do-while secara langsung di DataStudio. Lakukan commit dan deploy alur kerja ke Operation Center di lingkungan pengembangan, lalu jalankan task tersebut dari sana. |
| Kode node end | Komentar tidak didukung dalam kode node end. |
Komposisi node
Saat Anda membuat node do-while, DataWorks secara otomatis membuat tiga node internal:
| Node | Peran | Dapat dihapus? |
|---|---|---|
| start | Menandai awal setiap loop. Node task bergantung padanya dan node ini tidak melakukan pemrosesan apa pun. | Tidak |
| shell (node task default) | Placeholder untuk node task Shell. Hapus dan ganti dengan node task yang dibutuhkan oleh alur kerja Anda. | Ya |
| end | Mengevaluasi kondisi keluar dan mengembalikan True atau False. Pada dasarnya merupakan node assignment — node ini harus menjadi turunan dari semua node task. | Tidak |
Alur kerja internal harus selalu dimulai dengan start dan diakhiri dengan end. Anda dapat menghapus dan mengonfigurasi ulang dependensi antar node internal untuk membangun struktur alur kerja apa pun di antara keduanya.
Jika alur kerja internal menggunakan node branch untuk logika kondisional atau traversal hasil, node merge juga diperlukan. Lihat Konfigurasi node merge.

Variabel bawaan
Node do-while menyediakan variabel bawaan dalam format ${dag.<variable>}. Gunakan variabel ini dalam kode node task dan kode node end untuk membaca status loop atau data dari node assignment leluhur.
Variabel status loop
Variabel berikut selalu tersedia, terlepas dari apakah Anda menggunakan node assignment atau tidak.
| Variabel | Deskripsi | Loop 1 | Loop 2 | Loop n |
|---|---|---|---|---|
${dag.loopTimes} | Jumlah loop yang telah selesai | 1 | 2 | n |
${dag.offset} | Indeks berbasis nol dari loop saat ini | 0 | 1 | n-1 |
Variabel node assignment
Jika node do-while bergantung pada node assignment, Anda dapat meneruskan parameter output node assignment tersebut ke Input Parameters node do-while. Parameter input mengikuti format ${dag.<parameter-name>}, di mana <parameter-name> sesuai dengan nama yang Anda tetapkan di Input Parameters untuk node do-while.
Dalam tabel berikut, input adalah placeholder untuk nama parameter aktual yang Anda konfigurasi.
| Variabel | Deskripsi |
|---|---|
${dag.input} | Seluruh set data yang diteruskan oleh node assignment leluhur |
${dag.input[${dag.offset}]} | Entri data untuk loop saat ini |
${dag.input.length} | Jumlah entri dalam set data |
Tambahkan parameter output node assignment ke Output Parameters untuk node assignment tersebut, lalu tambahkan ke Input Parameters untuk node shell internal node do-while (bukan node do-while itu sendiri). Node shell internal membaca data menggunakan variabel ini dalam kodenya.
Nilai variabel berdasarkan jenis node assignment
Format data bergantung pada bahasa yang digunakan oleh node assignment.
| Jenis node assignment | Format data | Contoh ${dag.input[${dag.offset}]} |
|---|---|---|
| Shell | Array satu dimensi (nilai dipisahkan koma) | 2021-03-28 (loop 1), 2021-03-29 (loop 2) |
| ODPS SQL | Array dua dimensi (baris dan kolom) | 0016359810821, Hubei Province, 30 to 40 years old, Cancer (loop 1) |
Untuk detail lebih lanjut mengenai format output, lihat Format output parameter outputs.
Contoh 1: Node assignment Shell
Node assignment menghasilkan output: 2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01
| Variabel | Loop 1 | Loop 2 |
|---|---|---|
${dag.input} | 2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01 | (sama) |
${dag.input[${dag.offset}]} | 2021-03-28 | 2021-03-29 |
${dag.input.length} | 5 | (sama) |
${dag.loopTimes} | 1 | 2 |
${dag.offset} | 0 | 1 |
Contoh 2: Node assignment ODPS SQL
Klausa SELECT terakhir dari node assignment mengembalikan:
+----------------------------------------------+
| uid | region | age_range | zodiac |
+----------------------------------------------+
| 0016359810821 | Hubei Province | 30 to 40 years old | Cancer |
| 0016359814159 | Unknown | 30 to 40 years old | Cancer |
+----------------------------------------------+| Variabel | Loop 1 | Loop 2 |
|---|---|---|
${dag.input} | Seluruh tabel di atas | (sama) |
${dag.input[${dag.offset}]} | 0016359810821, Hubei Province, 30 to 40 years old, Cancer | 0016359814159, Unknown, 30 to 40 years old, Cancer |
${dag.input.length} | 2 (jumlah baris) | (sama) |
${dag.input[0][1]} | Hubei Province (baris 0, kolom 1) | — |
${dag.loopTimes} | 1 | 2 |
${dag.offset} | 0 | 1 |
Kode node end
Node end harus mengembalikan True untuk melanjutkan loop atau False untuk keluar. Tulis kode node end dalam ODPS SQL, Shell, atau Python 2. Komentar tidak didukung dalam kode node end.
ODPS SQL
Keluar setelah 10 loop atau ketika tabel kosong:
SELECT CASE
WHEN COUNT(1) > 0 AND ${dag.offset} <= 9
THEN true
ELSE false
END
FROM xc_dpe_e2.xc_rpt_user_info_d
WHERE dt = '20200101';Kueri ini membandingkan jumlah baris dan offset saat ini terhadap nilai tetap. Ketika ${dag.offset} melebihi 9 (setelah 10 loop) atau tabel tidak mengembalikan baris apa pun, node end mengembalikan false.
Shell
Keluar setelah 5 loop:
if [ ${dag.loopTimes} -lt 5 ]; then
echo "True"
else
echo "False"
fi${dag.loopTimes} bernilai 1 pada loop pertama dan bertambah 1 setiap iterasi. Saat loop kelima selesai, ${dag.loopTimes} sama dengan 5, kondisi tidak lagi terpenuhi, dan node end mengembalikan False.
Python 2
Keluar ketika semua baris dalam set hasil node assignment telah diproses:
if ${dag.loopTimes} < ${dag.input.length}:
print True
else:
print False${dag.input.length} adalah jumlah entri dalam set data. Loop berlanjut hingga ${dag.loopTimes} mencapai panjang set data, yang berarti setiap entri telah diproses.
Kasus penggunaan
Lakukan iterasi atas set hasil dengan node assignment
Gunakan node assignment untuk mengkueri atau menghitung set data, lalu gunakan node do-while untuk memproses setiap entri dalam loop.
Persiapan:
Buat node assignment (misalnya,
assign_node) yang menghasilkan set data.Buat node do-while yang bergantung pada
assign_node.Dependensi harus mengarah ke node do-while itu sendiri, bukan ke node shell internalnya.
Tambahkan parameter output
assign_nodeke Output Parameters untukassign_node.Tambahkan parameter yang sama ke Input Parameters untuk node task internal (node shell) dari node do-while.
Konfigurasikan parameter input pada node shell internal, bukan pada node do-while.
Dalam kode node end, gunakan
${dag.loopTimes}dan${dag.input.length}untuk keluar ketika semua entri telah diproses.
Untuk memverifikasi bahwa assign_node meneruskan outputnya dengan benar, gunakan fitur pengisian ulang data di Operation Center untuk mengisi ulang data kedua node tersebut secara bersamaan. Menjalankan node do-while saja akan melewatkan output dari node assignment.

Gabungkan dengan node branch dan node merge
Ketika alur kerja internal memerlukan logika kondisional atau traversal hasil, tambahkan node branch dan node merge di dalam node do-while.
Persiapan:
Di dalam node do-while, hubungkan node branch (
branch_node) dan node merge (merge_node) sebagai bagian dari alur kerja internal.Node branch dan node merge harus selalu digunakan bersama di dalam node do-while.
Lihat log
Untuk melihat log eksekusi node do-while di Operation Center:
Temukan node do-while dan buka grafik asiklik terarahnya (DAG).
Klik kanan nama node dan pilih View Internal Nodes.