From aa81562716a6863e4f9eaba7a926bdac8ceafee1 Mon Sep 17 00:00:00 2001 From: Li Liu Date: Mon, 3 Sep 2018 11:08:57 +0800 Subject: [PATCH] add solution template examples --- .../ForeachFilePartitionCopy.json | 231 ++++++++++++++++++ .../ForeachFilePartitionCopy/manifest.json | 5 + .../ForeachTablePartitionCopy.json | 215 ++++++++++++++++ .../ForeachTablePartitionCopy/manifest.json | 5 + 4 files changed, 456 insertions(+) create mode 100644 templates/ForeachFilePartitionCopy/ForeachFilePartitionCopy.json create mode 100644 templates/ForeachFilePartitionCopy/manifest.json create mode 100644 templates/ForeachTablePartitionCopy/ForeachTablePartitionCopy.json create mode 100644 templates/ForeachTablePartitionCopy/manifest.json diff --git a/templates/ForeachFilePartitionCopy/ForeachFilePartitionCopy.json b/templates/ForeachFilePartitionCopy/ForeachFilePartitionCopy.json new file mode 100644 index 0000000..e5f2a65 --- /dev/null +++ b/templates/ForeachFilePartitionCopy/ForeachFilePartitionCopy.json @@ -0,0 +1,231 @@ +{ + "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "factoryName": { + "type": "string", + "metadata": "Data Factory Name", + "defaultValue": "liliuMadridTestGit" + }, + "AzureBlobSource_properties_typeProperties_fileName": { + "type": "string", + "defaultValue": "@dataset().file" + }, + "AzureBlobSource_properties_typeProperties_folderPath": { + "type": "string", + "defaultValue": "@dataset().folder" + }, + "AzureBlobSink_properties_typeProperties_fileName": { + "type": "string", + "defaultValue": "" + }, + "AzureBlobSink_properties_typeProperties_folderPath": { + "type": "string", + "defaultValue": "@dataset().folder" + }, + "AzureBlobSource_properties_linkedServiceName": { + "type": "string", + "metadata": { + "linkedServiceType": "AzureBlobStorage" + } + }, + "AzureBlobSink_properties_linkedServiceName": { + "type": "string", + "metadata": { + "linkedServiceType": "AzureBlobStorage" + } + } + }, + "variables": { + "factoryId": "[concat('Microsoft.DataFactory/factories/', parameters('factoryName'))]" + }, + "resources": [ + { + "name": "[concat(parameters('factoryName'), '/ForeachFilePartitionCopy')]", + "type": "Microsoft.DataFactory/factories/pipelines", + "apiVersion": "2018-06-01", + "properties": { + "description": "Copying a large number of files between file-based storages template", + "activities": [ + { + "name": "GetPartitionList", + "description": "get item list", + "type": "GetMetadata", + "policy": { + "timeout": "7.00:00:00", + "retry": 0, + "retryIntervalInSeconds": 30, + "secureOutput": false, + "secureInput": false + }, + "typeProperties": { + "dataset": { + "referenceName": "AzureBlobSource", + "type": "DatasetReference", + "parameters": { + "folder": { + "value": "@pipeline().parameters.sourceFolder", + "type": "Expression" + }, + "file": " " + } + }, + "fieldList": [ + "childItems" + ] + } + }, + { + "name": "ForEachPartition", + "description": "copy for each item", + "type": "ForEach", + "dependsOn": [ + { + "activity": "GetPartitionList", + "dependencyConditions": [ + "Succeeded" + ] + } + ], + "typeProperties": { + "items": { + "value": "@activity('GetPartitionList').output.childItems", + "type": "Expression" + }, + "batchCount": 10, + "activities": [ + { + "name": "CopyOnePartition", + "description": "Do the copy", + "type": "Copy", + "policy": { + "timeout": "7.00:00:00", + "retry": 0, + "retryIntervalInSeconds": 30, + "secureOutput": false, + "secureInput": false + }, + "userProperties": [ + { + "name": "Source", + "value": "@{item().name}/" + }, + { + "name": "Destination", + "value": "@{item().name}/" + } + ], + "typeProperties": { + "source": { + "type": "BlobSource", + "recursive": true + }, + "sink": { + "type": "BlobSink" + }, + "enableStaging": false, + "dataIntegrationUnits": 0 + }, + "inputs": [ + { + "referenceName": "AzureBlobSource", + "type": "DatasetReference", + "parameters": { + "folder": { + "value": "@pipeline().parameters.sourceFolder", + "type": "Expression" + }, + "file": { + "value": "@item().name", + "type": "Expression" + } + } + } + ], + "outputs": [ + { + "referenceName": "AzureBlobSink", + "type": "DatasetReference", + "parameters": { + "folder": { + "value": "@pipeline().parameters.sinkFolder", + "type": "Expression" + } + } + } + ] + } + ] + } + } + ], + "parameters": { + "sourceFolder": { + "type": "String" + }, + "sinkFolder": { + "type": "String" + } + } + }, + "dependsOn": [ + "[concat(variables('factoryId'), '/datasets/AzureBlobSource')]", + "[concat(variables('factoryId'), '/datasets/AzureBlobSink')]" + ] + }, + { + "name": "[concat(parameters('factoryName'), '/AzureBlobSource')]", + "type": "Microsoft.DataFactory/factories/datasets", + "apiVersion": "2018-06-01", + "properties": { + "linkedServiceName": { + "referenceName": "[parameters('AzureBlobSource_properties_linkedServiceName')]", + "type": "LinkedServiceReference" + }, + "parameters": { + "folder": { + "type": "String" + }, + "file": { + "type": "String" + } + }, + "type": "AzureBlob", + "typeProperties": { + "fileName": { + "value": "[parameters('AzureBlobSource_properties_typeProperties_fileName')]", + "type": "Expression" + }, + "folderPath": { + "value": "[parameters('AzureBlobSource_properties_typeProperties_folderPath')]", + "type": "Expression" + } + } + } + }, + { + "name": "[concat(parameters('factoryName'), '/AzureBlobSink')]", + "type": "Microsoft.DataFactory/factories/datasets", + "apiVersion": "2018-06-01", + "properties": { + "linkedServiceName": { + "referenceName": "[parameters('AzureBlobSink_properties_linkedServiceName')]", + "type": "LinkedServiceReference" + }, + "parameters": { + "folder": { + "type": "String" + } + }, + "type": "AzureBlob", + "typeProperties": { + "fileName": "[parameters('AzureBlobSink_properties_typeProperties_fileName')]", + "folderPath": { + "value": "[parameters('AzureBlobSink_properties_typeProperties_folderPath')]", + "type": "Expression" + } + } + } + } + ] +} \ No newline at end of file diff --git a/templates/ForeachFilePartitionCopy/manifest.json b/templates/ForeachFilePartitionCopy/manifest.json new file mode 100644 index 0000000..c139a82 --- /dev/null +++ b/templates/ForeachFilePartitionCopy/manifest.json @@ -0,0 +1,5 @@ +{ + "name": "ForeachFilePartitionCopy", + "description": "Copying a large number of files between file-based storages template", + "image": "data:image/png;base64,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" +} \ No newline at end of file diff --git a/templates/ForeachTablePartitionCopy/ForeachTablePartitionCopy.json b/templates/ForeachTablePartitionCopy/ForeachTablePartitionCopy.json new file mode 100644 index 0000000..317c58f --- /dev/null +++ b/templates/ForeachTablePartitionCopy/ForeachTablePartitionCopy.json @@ -0,0 +1,215 @@ +{ + "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "factoryName": { + "type": "string", + "metadata": "Data Factory Name", + "defaultValue": "liliuMadridTestGit" + }, + "AzureBlobDestination_properties_typeProperties_folderPath": { + "type": "string", + "defaultValue": "@dataset().folder" + }, + "AzureSqlTableLookup_properties_linkedServiceName": { + "type": "string", + "metadata": { + "linkedServiceType": "AzureSqlDatabase" + } + }, + "AzureSqlTableSource_properties_linkedServiceName": { + "type": "string", + "metadata": { + "linkedServiceType": "AzureSqlDatabase" + } + }, + "AzureBlobDestination_properties_linkedServiceName": { + "type": "string", + "metadata": { + "linkedServiceType": "AzureBlobStorage" + } + } + }, + "variables": { + "factoryId": "[concat('Microsoft.DataFactory/factories/', parameters('factoryName'))]" + }, + "resources": [ + { + "name": "[concat(parameters('factoryName'), '/ForeachTablePartitionCopy')]", + "type": "Microsoft.DataFactory/factories/pipelines", + "apiVersion": "2018-06-01", + "properties": { + "activities": [ + { + "name": "ForEachPartition", + "type": "ForEach", + "dependsOn": [ + { + "activity": "GetPartitionList", + "dependencyConditions": [ + "Succeeded" + ] + } + ], + "typeProperties": { + "items": { + "value": "@activity('GetPartitionList').output.value", + "type": "Expression" + }, + "batchCount": 10, + "activities": [ + { + "name": "CopyOnePartition", + "description": "Do the real copy", + "type": "Copy", + "policy": { + "timeout": "7.00:00:00", + "retry": 0, + "retryIntervalInSeconds": 30, + "secureOutput": false, + "secureInput": false + }, + "typeProperties": { + "source": { + "type": "SqlSource" + }, + "sink": { + "type": "BlobSink" + }, + "enableStaging": false, + "dataIntegrationUnits": 0 + }, + "inputs": [ + { + "referenceName": "AzureSqlTableSource", + "type": "DatasetReference", + "parameters": { + "tableName": { + "value": "[concat('[', '@{item().TABLE_SCHEMA}].[@{item().TABLE_NAME}]')]", + "type": "Expression" + } + } + } + ], + "outputs": [ + { + "referenceName": "AzureBlobDestination", + "type": "DatasetReference", + "parameters": { + "folder": { + "value": "@pipeline().parameters.sinkFolder", + "type": "Expression" + } + } + } + ] + } + ] + } + }, + { + "name": "GetPartitionList", + "type": "Lookup", + "policy": { + "timeout": "7.00:00:00", + "retry": 0, + "retryIntervalInSeconds": 30, + "secureOutput": false, + "secureInput": false + }, + "typeProperties": { + "source": { + "type": "SqlSource", + "sqlReaderQuery": "SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES" + }, + "dataset": { + "referenceName": "AzureSqlTableLookup", + "type": "DatasetReference" + }, + "firstRowOnly": false + } + } + ], + "parameters": { + "sinkFolder": { + "type": "String" + } + } + }, + "dependsOn": [ + "[concat(variables('factoryId'), '/datasets/AzureSqlTableLookup')]", + "[concat(variables('factoryId'), '/datasets/AzureSqlTableSource')]", + "[concat(variables('factoryId'), '/datasets/AzureBlobDestination')]" + ] + }, + { + "name": "[concat(parameters('factoryName'), '/AzureSqlTableLookup')]", + "type": "Microsoft.DataFactory/factories/datasets", + "apiVersion": "2018-06-01", + "properties": { + "description": "Data source for lookup activity, should has the same linked service with AzureSqlTableSource", + "linkedServiceName": { + "referenceName": "[parameters('AzureSqlTableLookup_properties_linkedServiceName')]", + "type": "LinkedServiceReference" + }, + "type": "AzureSqlTable" + } + }, + { + "name": "[concat(parameters('factoryName'), '/AzureSqlTableSource')]", + "type": "Microsoft.DataFactory/factories/datasets", + "apiVersion": "2018-06-01", + "properties": { + "description": "Data source for copy activity, should has the same linked service with AzureSqlTableLookup", + "linkedServiceName": { + "referenceName": "[parameters('AzureSqlTableSource_properties_linkedServiceName')]", + "type": "LinkedServiceReference" + }, + "parameters": { + "tableName": { + "type": "String" + } + }, + "type": "AzureSqlTable", + "typeProperties": { + "tableName": { + "value": "@dataset().tableName", + "type": "Expression" + } + } + } + }, + { + "name": "[concat(parameters('factoryName'), '/AzureBlobDestination')]", + "type": "Microsoft.DataFactory/factories/datasets", + "apiVersion": "2018-06-01", + "properties": { + "linkedServiceName": { + "referenceName": "[parameters('AzureBlobDestination_properties_linkedServiceName')]", + "type": "LinkedServiceReference" + }, + "parameters": { + "folder": { + "type": "String" + } + }, + "type": "AzureBlob", + "typeProperties": { + "format": { + "type": "TextFormat", + "columnDelimiter": ",", + "rowDelimiter": "", + "nullValue": "\\N", + "treatEmptyAsNull": true, + "skipLineCount": 0, + "firstRowAsHeader": false + }, + "folderPath": { + "value": "[parameters('AzureBlobDestination_properties_typeProperties_folderPath')]", + "type": "Expression" + } + } + } + } + ] +} \ No newline at end of file diff --git a/templates/ForeachTablePartitionCopy/manifest.json b/templates/ForeachTablePartitionCopy/manifest.json new file mode 100644 index 0000000..84e6065 --- /dev/null +++ b/templates/ForeachTablePartitionCopy/manifest.json @@ -0,0 +1,5 @@ +{ + "name": "ForeachTablePartitionCopy", + "description": "Table partition foreach", + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAADwCAYAAAAuPDIiAAAcGklEQVR4Xu3dDXBU5b3H8f8mSIBAgAsDLakgMLcFRWRG5E2q9QKtvQhUpCoW8f1tpFqkotaXRqnvImNrsWodgcFebUcvL9IqYFGIYRARqUKDinoJCAQjIgkvScze+Z/2xJPNbpJ9kmf37JPvznSuF87znPN8nv/Z33nO2V0iwgsBBBBAAAEDgYhBG5oggAACCCAgBAhFgAACCCBgJECAGLHRCAEEEECAAKEGEEAAAQSMBAgQIzYaIYAAAggQINQAAggggICRAAFixEYjBBBAAAEChBpAAAEEEDASIECM2GiEAAIIIECAUAMIIIAAAkYCBIgRG40QQAABBAgQagABBBBAwEiAADFioxECCCCAAAFCDSCAAAIIGAkQIEZsNEIAAQQQIECoAQQQQAABIwECxIiNRggggAACBAg1gAACCCBgJECAGLHRCAEEEECAAKEGEEAAAQSMBAgQIzYaIYAAAggQINQAAggggICRAAFixEYjBBBAAAEChBpAAAEEEDASIECM2GiEAAIIIECAUAMIIIAAAkYCBIgRG40QQAABBAgQagABBBBAwEiAADFioxECCCCAAAFCDSCAAAIIGAkQIEZsNEIAAQQQIECoAQQQQAABIwECxIiNRggggAACBAg1gAACCCBgJECAGLHRCAEEEECAAKEGEEAAAQSMBAgQIzYaIYAAAggQINQAAggggICRAAFixEYjBBBAAAEChBpAAAEEEDASIECM2GiEAAIIIECAUAMIIIAAAkYCBIgRG40QQAABBAgQagABBBBAwEiAADFioxECCCCAAAFCDSCAAAIIGAkQIEZsNEIAAQQQIECoAQQQQAABIwECxIiNRggggAACBAg1gAACCCBgJECAGLHRCAEEEECAAKEGEEAAAQSMBAgQIzYaIYAAAggQINQAAggggICRAAFixEYjBBBAAAEChBpAAAEEEDASIECM2GiEAAIIIECAUAMIIIAAAkYCBIgRG40QQAABBAgQagABBBBAwEiAADFioxECCCCAAAFCDSCAAAIIGAkQIEZsNEIAAQQQIECoAQQQQAABIwECxIiNRggggAACBAg1gAACCCBgJECAGLHRCAEEEECAAKEGEEAAAQSMBAgQIzYaIYAAAggQINQAAggggICRAAFixEYj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" +} \ No newline at end of file