لكل نشاط في Azure Data Factory وAzure Synapse Analytics
ينطبق على: Azure Data Factory Azure Synapse Analytics
تلميح
جرب Data Factory في Microsoft Fabric، وهو حل تحليلي متكامل للمؤسسات. يغطي Microsoft Fabric كل شيء بدءا من حركة البيانات إلى علم البيانات والتحليلات في الوقت الحقيقي والمعلومات المهنية وإعداد التقارير. تعرف على كيفية بدء إصدار تجريبي جديد مجانا!
يحدد نشاط ForEach تدفق تحكم متكرر في Azure Data Factory أو المسار Synapse. يتم استخدام هذا النشاط للتكرار عبر مجموعة، وهو ينفّذ الأنشطة المحددة في تكرار حلقي. تنفيذ التكرار الحلقي لهذا النشاط مماثل لبنية التكرارات الحلقية Foreach في لغات الكمبيوتر.
قم بإنشاء نشاط ForEach باستخدام واجهة المستخدم
لاستخدام نشاط ForEach في البنية الأساسية لبرنامج ربط العمليات التجارية، أكمل الخطوات التالية:
يمكنك استخدام أي متغير من نوع صفيف أو مخرجات من أنشطة أخرى كمدخل لنشاط ForEach الخاص بك. لإنشاء متغير صفيف، حدد خلفية لوحة مسارات التدفق ثم حدد علامة التبويب Variables لإضافة متغير نوع صفيف كما هو موضح أدناه.
ابحث عن ForEach في جزء أنشطة البنية الأساسية لبرنامج ربط العمليات التجارية، واسحب نشاط ForEach إلى لوحة البنية الأساسية لبرنامج ربط العمليات التجارية.
حدد نشاط ForEach الجديد على اللوحة إذا لم يكن محدداً بالفعل، وحدد علامة التبويب Settings لتعديل تفاصيله.
حدد حقل Items ثم حدد الرابط Add dynamic content لفتح جزء محرر المحتوى الديناميكي.
حدد صفيف الإدخال لتتم تصفيتها في محرر المحتوى الديناميكي. في هذا المثال، نختار المتغير الذي تم إنشاؤه في الخطوة الأولى.
حدد محرر الأنشطة في نشاط ForEach لإضافة نشاط واحد أو أكثر ليتم تنفيذه لكل عنصر في صفيف Items.
في أي أنشطة تقوم بإنشائها داخل نشاط ForEach، يمكنك الرجوع إلى العنصر الحالي الذي يقوم نشاط ForEach بالتكرار خلاله من قائمة العناصر. يمكنك الرجوع إلى العنصر الحالي في أي مكان يمكنك فيه استخدام تعبير ديناميكي لتحديد قيمة خاصية. في محرر المحتوى الديناميكي، حدد ForEach iterator لإرجاع العنصر الحالي.
بناء الجملة
يتم وصف الخصائص لاحقاً في هذه المقالة. تعتبر خاصية العناصر هي المجموعة ويتم الإشارة إلى كل عنصر في المجموعة باستخدام @item()
كما هو موضح في البنية التالية:
{
"name":"MyForEachActivityName",
"type":"ForEach",
"typeProperties":{
"isSequential":"true",
"items": {
"value": "@pipeline().parameters.mySinkDatasetFolderPathCollection",
"type": "Expression"
},
"activities":[
{
"name":"MyCopyActivity",
"type":"Copy",
"typeProperties":{
...
},
"inputs":[
{
"referenceName":"MyDataset",
"type":"DatasetReference",
"parameters":{
"MyFolderPath":"@pipeline().parameters.mySourceDatasetFolderPath"
}
}
],
"outputs":[
{
"referenceName":"MyDataset",
"type":"DatasetReference",
"parameters":{
"MyFolderPath":"@item()"
}
}
]
}
]
}
}
خصائص النوع
الخاصية | الوصف | القيم المسموح بها | المطلوب |
---|---|---|---|
الاسم | اسم النشاط لكل نشاط. | السلسلة | نعم |
النوع | يجب التعيين على ForEach | السلسلة | نعم |
متسلسل | يحدد ما إذا كان يجب تنفيذ الحلقة بالتتابع أو بالتوازي. يمكن تنفيذ 50 تكراراً كحد أقصى مرة واحدة بالتوازي). على سبيل المثال، إذا كان لديك نشاط ForEach يتكرر عبر نشاط نسخ مع 10 مجموعات بيانات مصدر وحوض مختلفة مع تعيين isSequential على False، يتم تنفيذ جميع النسخ مرة واحدة. الافتراضي هو خطأ. إذا تم تعيين "isSequential" على False، فتأكد من وجود تكوين صحيح لتشغيل العديد من الملفات التنفيذية. وإلا، يجب استخدام هذه الخاصية بحذر لتجنب حدوث تعارضات في الكتابة. لمزيد من المعلومات، راجع قسم التنفيذ المتوازي . |
Boolean | لا. الافتراضي هو خطأ. |
watchCount | عدد الدفعات الذي سيتم استخدامه للتحكم في عدد عمليات التنفيذ المتوازية (عندما يتم تعيين isSequential إلى false). هذا هو الحد الأعلى للتزامن، ولكن لن يتم دائماً تنفيذ النشاط لكل نشاط عند هذا الرقم | عدد صحيح (بحد أقصى 50) | لا. الافتراضي هو 20. |
Items | عبارة تُرجع مصفوفة JSON ليتم تكرارها. | التعبير (الذي يُرجع مصفوفة JSON) | نعم |
الأنشطة | الأنشطة المراد تنفيذها. | قائمة الأنشطة | نعم |
التنفيذ المتزامن
إذا تم تعيين isSequential على false، فسيتم تكرار النشاط بالتوازي مع حد أقصى قدره 50 تكراراً متزامناً. يجب استخدام هذا الإعداد بحذر. إذا كانت التكرارات المتزامنة تكتب إلى نفس المجلد ولكن إلى ملفات مختلفة، فإن هذا الأسلوب جيد. إذا كانت التكرارات المتزامنة تكتب بشكل متزامن إلى نفس الملف بالضبط، فمن المرجح أن يتسبب هذا الأسلوب في حدوث خطأ.
لغة تعبير التكرار
في نشاط ForEach، قم بتوفير صفيف ليتم تكراره للخاصية items. "استخدم @item()
للتكرار عبر تعداد واحد في نشاط ForEach. على سبيل المثال، إذا كانت العناصر عبارة عن مصفوفة: [1، 2، 3]، فإن @item()
تعرض 1 في التكرار الأول، و2 في التكرار الثاني، و3 في التكرار الثالث. يمكنك أيضاً استخدام تعبير مثل @range(0,10)
للتكرار عشر مرات بدءاً من 0 وتنتهي بالرقم 9.
التكرار على نشاط واحد
السيناريو: انسخ من نفس الملف المصدر في Azure Blob إلى ملفات وجهة متعددة في Azure Blob.
تعريف المسار
{
"name": "<MyForEachPipeline>",
"properties": {
"activities": [
{
"name": "<MyForEachActivity>",
"type": "ForEach",
"typeProperties": {
"isSequential": "true",
"items": {
"value": "@pipeline().parameters.mySinkDatasetFolderPath",
"type": "Expression"
},
"activities": [
{
"name": "MyCopyActivity",
"type": "Copy",
"typeProperties": {
"source": {
"type": "BlobSource",
"recursive": "false"
},
"sink": {
"type": "BlobSink",
"copyBehavior": "PreserveHierarchy"
}
},
"inputs": [
{
"referenceName": "<MyDataset>",
"type": "DatasetReference",
"parameters": {
"MyFolderPath": "@pipeline().parameters.mySourceDatasetFolderPath"
}
}
],
"outputs": [
{
"referenceName": "MyDataset",
"type": "DatasetReference",
"parameters": {
"MyFolderPath": "@item()"
}
}
]
}
]
}
}
],
"parameters": {
"mySourceDatasetFolderPath": {
"type": "String"
},
"mySinkDatasetFolderPath": {
"type": "String"
}
}
}
}
تعريف مجموعة البيانات Blob
{
"name":"<MyDataset>",
"properties":{
"type":"AzureBlob",
"typeProperties":{
"folderPath":{
"value":"@dataset().MyFolderPath",
"type":"Expression"
}
},
"linkedServiceName":{
"referenceName":"StorageLinkedService",
"type":"LinkedServiceReference"
},
"parameters":{
"MyFolderPath":{
"type":"String"
}
}
}
}
قم بتشغيل قيم المعلمات
{
"mySourceDatasetFolderPath": "input/",
"mySinkDatasetFolderPath": [ "outputs/file1", "outputs/file2" ]
}
كرر على أنشطة متعددة
من الممكن تكرار الأنشطة المتعددة (على سبيل المثال: أنشطة النسخ والويب) في نشاط ForEach. في هذا السيناريو، نوصي بإخراج أنشطة متعددة في مسار منفصل. بعد ذلك، يمكنك استخدام نشاط ExecutePipeline في المسار مع نشاط ForEach لاستدعاء المسار المنفصل مع أنشطة متعددة.
بناء الجملة
{
"name": "masterPipeline",
"properties": {
"activities": [
{
"type": "ForEach",
"name": "<MyForEachMultipleActivities>"
"typeProperties": {
"isSequential": true,
"items": {
...
},
"activities": [
{
"type": "ExecutePipeline",
"name": "<MyInnerPipeline>"
"typeProperties": {
"pipeline": {
"referenceName": "<copyHttpPipeline>",
"type": "PipelineReference"
},
"parameters": {
...
},
"waitOnCompletion": true
}
}
]
}
}
],
"parameters": {
...
}
}
}
مثال
السيناريو: التكرار عبر InnerPipeline داخل نشاط ForEach باستخدام نشاط تنفيذ المسار. يتم نسخ المسار الداخلي مع تحديد معلمات لتعريفات المخطط.
تعريف المسار الرئيسي
{
"name": "masterPipeline",
"properties": {
"activities": [
{
"type": "ForEach",
"name": "MyForEachActivity",
"typeProperties": {
"isSequential": true,
"items": {
"value": "@pipeline().parameters.inputtables",
"type": "Expression"
},
"activities": [
{
"type": "ExecutePipeline",
"typeProperties": {
"pipeline": {
"referenceName": "InnerCopyPipeline",
"type": "PipelineReference"
},
"parameters": {
"sourceTableName": {
"value": "@item().SourceTable",
"type": "Expression"
},
"sourceTableStructure": {
"value": "@item().SourceTableStructure",
"type": "Expression"
},
"sinkTableName": {
"value": "@item().DestTable",
"type": "Expression"
},
"sinkTableStructure": {
"value": "@item().DestTableStructure",
"type": "Expression"
}
},
"waitOnCompletion": true
},
"name": "ExecuteCopyPipeline"
}
]
}
}
],
"parameters": {
"inputtables": {
"type": "Array"
}
}
}
}
تعريف المسار الداخلي
{
"name": "InnerCopyPipeline",
"properties": {
"activities": [
{
"type": "Copy",
"typeProperties": {
"source": {
"type": "SqlSource",
}
},
"sink": {
"type": "SqlSink"
}
},
"name": "CopyActivity",
"inputs": [
{
"referenceName": "sqlSourceDataset",
"parameters": {
"SqlTableName": {
"value": "@pipeline().parameters.sourceTableName",
"type": "Expression"
},
"SqlTableStructure": {
"value": "@pipeline().parameters.sourceTableStructure",
"type": "Expression"
}
},
"type": "DatasetReference"
}
],
"outputs": [
{
"referenceName": "sqlSinkDataset",
"parameters": {
"SqlTableName": {
"value": "@pipeline().parameters.sinkTableName",
"type": "Expression"
},
"SqlTableStructure": {
"value": "@pipeline().parameters.sinkTableStructure",
"type": "Expression"
}
},
"type": "DatasetReference"
}
]
}
],
"parameters": {
"sourceTableName": {
"type": "String"
},
"sourceTableStructure": {
"type": "String"
},
"sinkTableName": {
"type": "String"
},
"sinkTableStructure": {
"type": "String"
}
}
}
}
تعريف مجموعة البيانات المصدر
{
"name": "sqlSourceDataset",
"properties": {
"type": "SqlServerTable",
"typeProperties": {
"tableName": {
"value": "@dataset().SqlTableName",
"type": "Expression"
}
},
"structure": {
"value": "@dataset().SqlTableStructure",
"type": "Expression"
},
"linkedServiceName": {
"referenceName": "sqlserverLS",
"type": "LinkedServiceReference"
},
"parameters": {
"SqlTableName": {
"type": "String"
},
"SqlTableStructure": {
"type": "String"
}
}
}
}
تعريف مجموعة بيانات المغسلة
{
"name": "sqlSinkDataSet",
"properties": {
"type": "AzureSqlTable",
"typeProperties": {
"tableName": {
"value": "@dataset().SqlTableName",
"type": "Expression"
}
},
"structure": {
"value": "@dataset().SqlTableStructure",
"type": "Expression"
},
"linkedServiceName": {
"referenceName": "azureSqlLS",
"type": "LinkedServiceReference"
},
"parameters": {
"SqlTableName": {
"type": "String"
},
"SqlTableStructure": {
"type": "String"
}
}
}
}
معلمات المسار الرئيسية
{
"inputtables": [
{
"SourceTable": "department",
"SourceTableStructure": [
{
"name": "departmentid",
"type": "int"
},
{
"name": "departmentname",
"type": "string"
}
],
"DestTable": "department2",
"DestTableStructure": [
{
"name": "departmentid",
"type": "int"
},
{
"name": "departmentname",
"type": "string"
}
]
}
]
}
تجميع المخرجات
لتجميع مخرجات نشاط foreach، يرجى استخدام نشاط Variables وAppariable.
أولاً، قم بالإعلان عن array
متغير في المسار. ثم قم باستدعاء نشاط إلحاق متغير داخل كل حلقة foreach. بعد ذلك، يمكنك استرداد التجميع من المصفوفة الخاصة بك.
القيود والحلول
فيما يلي بعض قيود نشاط ForEach والحلول المقترحة.
القيد | الطرق البديلة |
---|---|
لا يمكنك تداخل حلقة ForEach داخل حلقة ForEach أخرى (أو حلقة حتى). | صمم المسار من مستويين حيث يتكرر المسار الخارجي مع حلقة ForEach الخارجية عبر مسار داخلي مع الحلقة المتداخلة. |
يحتوي نشاط ForEach على حد أقصى يبلغ batchCount 50 عنصراً للمعالجة المتوازية، وبحد أقصى 100000 عنصر. |
صمم المسار من مستويين حيث يتكرر مسار الخارجي مع نشاط ForEach عبر مسار. |
لا يمكن استخدام SetVariable داخل نشاط ForEach يتم تشغيله بالتوازي نظراً لأن المتغيرات عامة بالنسبة إلى المسار بالكامل، ولا يتم تحديد نطاقها في ForEach أو أي نشاط آخر. | ضع في اعتبارك استخدام ForEach المتسلسل أو استخدم Execute Pipeline داخل ForEach (متغير / معلمة يتم التعامل معها في المسار التابع). |
المحتوى ذو الصلة
راجع أنشطة تدفق التحكم الأخرى المدعومة: