DataWorks menyediakan node for-each yang dapat Anda gunakan untuk melakukan loop melalui result set dari node assignment dan mengorkestrasi alur bisnis. Topik ini menjelaskan komponen dan logika node for-each.
Catatan penggunaan
Tabel berikut menjelaskan cara menggunakan node for-each.
Description | References |
Pelajari skenario di mana Anda dapat menggunakan node for-each. | Catatan Ini hanya digunakan untuk menelusuri result set yang dikembalikan oleh node assignment. |
Pelajari batasan dan catatan untuk node for-each, seperti jumlah maksimum penelusuran, cara menguji node tersebut, dan cara melihat log. | |
Pelajari cara menyesuaikan alur bisnis di dalam node for-each. Alur tersebut harus dimulai dengan node Start bawaan dan diakhiri dengan node End bawaan. | |
Pelajari bahwa jumlah penelusuran untuk node for-each ditentukan oleh output dari node assignment hulu-nya. | |
Pelajari bahwa node for-each menyediakan variabel bawaan untuk mengambil nilai terkait pada setiap penelusuran. | |
Lihat contoh cara mengambil nilai variabel dan bagaimana jumlah penelusuran dihitung. | Examples of retrieving values when the upstream assignment node is a Shell or ODPS SQL node |
Scenarios
Node for-each DataWorks terutama digunakan untuk skenario yang memerlukan loop. Node ini harus digunakan bersama dengan assignment node hulu. Node for-each menerima output dari assignment node lalu melakukan loop melalui hasil tersebut.

Limits
Node for-each hanya didukung di DataWorks Edisi Standar dan versi yang lebih baru. Untuk informasi selengkapnya, lihat Feature Details by Version.
Node for-each dapat melakukan loop maksimal 1.024 kali. Jumlah penelusuran aktual ditentukan oleh result set yang dihasilkan oleh assignment node.
Eksekusi konkuren tidak didukung. Loop baru hanya dapat dimulai setelah loop sebelumnya selesai.
Notes
Dimension | Category | Description |
Upstream and downstream dependencies | Dependency settings | Node for-each menelusuri nilai yang diteruskan dari assignment node. Oleh karena itu, assignment node harus menjadi node hulu dari node for-each. |
Traversal support | Maximum number of traversals | Node for-each mendukung maksimal 1.024 loop. Jika batas ini dilampaui, akan terjadi runtime error. Jumlah loop aktual dikendalikan oleh output dari assignment node hulu. |
Number of traversals | Ditentukan oleh result set yang dihasilkan oleh assignment node. | |
Inner nodes | Flow orchestration |
|
Value retrieval | Variabel bawaan disediakan untuk mengambil nilai tertentu dari assignment node hulu. | |
Debugging and running | Task debugging |
|
View logs | Saat Anda melihat log eksekusi node for-each di Operation Center, klik kanan instans tersebut lalu klik View Inner Nodes untuk melihat log eksekusi inner node-nya. |
Node components and flow orchestration
Node for-each di DataWorks merupakan jenis node khusus yang berisi inner node. Saat Anda membuat node for-each, tiga inner node dibuat secara otomatis: Start node (awal loop), Shell node (loop task), dan End node (akhir loop). Inner node ini membentuk alur internal yang melakukan loop melalui output dari assignment node hulu.
Seperti yang ditunjukkan pada gambar di atas:
Shell node
Secara default, DataWorks membuat inner node Shell untuk menjalankan task. Anda juga dapat menghapus Shell node default dan menyesuaikan node untuk task penelusuran loop.
Jika task penelusuran loop adalah task Shell, Anda dapat mengklik ganda Shell node untuk membuka editor kode dan mengembangkan kode task tersebut.
Jika task penelusuran loop kompleks, Anda dapat membuat node task lain dalam alur internal dan membangun ulang proses eksekusi node sesuai kebutuhan.
CatatanSaat Anda menyesuaikan node task loop, Anda dapat menghapus dependensi antar inner node dan mengorkestrasi ulang alur internal. Namun, Start node dan End node harus tetap menjadi node pertama dan terakhir dalam alur internal.
Start node dan End node
Keduanya merupakan node awal dan akhir untuk setiap loop dalam alur internal. Node ini tidak berisi kode task tertentu.
CatatanEnd node dari node for-each tidak mengontrol jumlah loop. Jumlah loop ditentukan oleh output dari assignment node hulu.
Number of traversals
Node for-each dapat melakukan loop maksimal 1.024 kali. Jumlah penelusuran aktual ditentukan oleh result set yang dihasilkan oleh assignment node.
Jumlah penelusuran ditentukan oleh result set yang dihasilkan oleh assignment node:
Penelusuran Shell dan Python: Output berupa array satu dimensi. Jumlah loop sama dengan jumlah elemen dalam array tersebut. Elemen-elemennya dipisahkan oleh koma.
Sebagai contoh, jika bahasa assignment dari assignment node adalah Shell atau Python (Python 2) dan output-nya adalah array satu dimensi
2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01, maka node for-each akan melakukan loop lima kali.Penelusuran SQL: Output berupa array dua dimensi. Jumlah loop sama dengan jumlah baris dalam array tersebut.
Sebagai contoh, jika bahasa assignment dari assignment node adalah ODPS SQL dan output-nya adalah array dua dimensi:
+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | Hubei Province | 30-40 years old | Cancer | | 0016359814159 | Unknown | 30-40 years old | Cancer | +----------------------------------------------+Maka node for-each akan melakukan loop dua kali.
Built-in variables
Anda dapat menggunakan metode berikut dalam inner node node for-each untuk mengambil result set dari assignment node hulu. Jika terdapat assignment node dalam alur internal node for-each, Anda dapat mengambil nilai menggunakan metode pengambilan nilai default untuk node hilir. Untuk informasi selengkapnya tentang metode pengambilan nilai, lihat Assignment node.
Saat node for-each DataWorks melakukan loop melalui output assignment node, Anda dapat menggunakan variabel bawaan untuk mengambil nomor loop saat ini dan offset-nya.
Built-in variable | Description | Comparison with a for loop |
| Mengambil dataset dari assignment node. | Ekuivalen dengan kode berikut dalam for loop: |
| Mengambil nilai penelusuran saat ini. | Ambil contoh for loop berikut:
|
| Offset saat ini (offset setiap penelusuran relatif terhadap penelusuran pertama). | |
| Mengambil jumlah penelusuran saat ini. | - |
Jika Anda mengetahui skema tabel dari output Anda, Anda dapat menggunakan variabel berikut untuk mengambil nilai lainnya.
Other variable | Description |
| Saat output assignment node hulu berupa array dua dimensi, variabel ini mengambil data kolom tertentu pada baris data saat ini selama setiap penelusuran. |
| Saat output assignment node hulu berupa array dua dimensi, variabel ini mengambil data pada baris i dan kolom j dari dataset. |
| Saat output assignment node hulu berupa array satu dimensi, variabel ini mengambil data pada indeks tertentu. |
Examples of using built-in variables
Example 1: The upstream assignment node is a Shell node
Assignment node output
Assignment node hulu adalah node Shell. Output akhirnya adalah
2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01.Value retrieval in the for-each node
CatatanKarena output berupa array satu dimensi dengan lima elemen yang dipisahkan koma, node for-each melakukan loop lima kali.
Built-in variable
Value in the 1st loop
Value in the 2nd loop
${dag.loopDataArray}2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01${dag.foreach.current}2021-03-282021-03-29${dag.offset}0
1
${dag.loopTimes}1
2
${dag.foreach.current[3]}2021-03-30
Example 2: The upstream assignment node is an ODPS SQL node
Output from the assignment node
Assignment node hulu adalah node ODPS SQL. Pernyataan select terakhir mengembalikan dua catatan:
+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | Hubei Province | 30-40 years old | Cancer | | 0016359814159 | Unknown | 30-40 years old | Cancer | +----------------------------------------------+Retrieving values in the for-each node
CatatanKarena output berupa array dua dimensi dengan dua baris, node for-each melakukan penelusuran dua kali.
Built-in variable
Value in the 1st loop
Value in the 2nd loop
${dag.loopDataArray}+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | Hubei Province | 30-40 years old | Cancer | | 0016359814159 | Unknown | 30-40 years old | Cancer | +----------------------------------------------+${dag.foreach.current}0016359810821,Hubei Province,30-40 years old,Cancer0016359814159,Unknown,30-40 years old,Cancer${dag.offset}0
1
${dag.loopTimes}1
2
${dag.foreach.current[0]}00163598108210016359814159${dag.loopDataArray[1][0]}0016359814159