一,引言

在实际的项目中,Azure Data Factroy 中的 Data Flow 并不能彻底帮我们完成一系列复制逻辑计算, 比如我们需要针对数据集的每一行数据进行判断计算,Data Flow 就显的有些吃力。别怕,Azure Data Factory 提供了调用 Azure Function 的组件,有了代码的加持,那么解决更复杂的都能迎刃而解!!那么就开始今天的表演吧

二,正文

1,准备 Azure Function

打开 Azure Portal ,点击 "Create a resource" 快速创建 Azure Function

以下就是刚创建好的  Azure  Function,Operating System 选择 "Windows",Runtime 选择:"node js"

添加 名字为 “Http_skip_holiday” 的 Function

Function Code:

 1 const intercept = require("azure-function-log-intercept");
2
3 module.exports = async function (context, req) {
4 context.log('JavaScript HTTP trigger function processed a request.');
5 intercept(context);
6 let lo_date = (req.query.lo_date || (req.body && req.body.lo_date));
7 let skipday = (req.query.skipday || (req.body && req.body.skipday));
8 context.log("req.body:"+req.body);
9 context.log("lo_date:"+req.body.lo_date);
10 context.log("req.body:"+req.body.skipday);
11 //server Info
12
13 // Holiday Handling
14 let holidayArray = ['2023-01-01','2023-01-06','2023-01-07','2023-01-13','2023-01-14','2023-01-21','2023-01-27','2023-01-28'];
15 context.log("holidayArray.length: ", holidayArray.length);
16
17 let due_dateObj= calculate_dueDate(context,lo_date,holidayArray,skipday)
18 context.log("due_dateObj.Step: ", due_dateObj.Step);
19 context.res = {
20 status: 200, /* Defaults to 200 */
21 body: due_dateObj
22 };
23 }
24
25 function calculate_dueDate(context,lodate, holidayArray, num) {
26 "use strict";
27 let DueDateObj={};
28 let lo_date = new Date(lodate);
29 let Year = lo_date.getFullYear();
30 let Month = lo_date.getMonth();
31 let day = lo_date.getDate();
32
33 let dueDate;
34 let step = num;
35 let isWorkDay = false;
36 do {
37
38 let currentDate = new Date(Year, Month, day + step);
39
40 if (currentDate.toDateString() in holidayArray || (currentDate.getDay() < 1)) {
41 step++;
42 } else {
43 isWorkDay = true;
44 }
45 } while (!isWorkDay);
46
47
48 dueDate = new Date(Year, Month, day + step);
49 DueDateObj.DueDate=dueDate.toString("yyyy-MM-dd");
50 DueDateObj.Step=step;
51 context.log("dueDate:"+dueDate.toString("yyyy-MM-dd"));
52 return DueDateObj;
53 }

开启 Function 后,,我们使用 Postman 进行测试

注意:1)打开 Function 的 Filesystem Logs

 2)如果Function 的访问基本不是 "" 那么就得在调用 Function 的 Url 后面加上验证身份的 Code 

Postman 进行结果测试

2,Data Factory 中配置调用 Function

1)使用 LookUp 查询需要更新的数据集

2)利用 Foreach 循环编辑数据集,并根据每一天数据的 "inputdate","skipday" 作为参数调用  Azure Function

Foreach 的数据集合:

@activity('Lookup_Data').output.value

Function 的 Body 参数配置

@concat('{"lo_date":"',item().inputdate,'","skipday":',item().skipday,'}')

pipeline code

{
"name": "test_pipeline",
"properties": {
"activities": [
{
"name": "Lookup_Data",
"type": "Lookup",
"dependsOn": [],
"policy": {
"timeout": "0.12:00:00",
"retry": 0,
"retryIntervalInSeconds": 30,
"secureOutput": false,
"secureInput": false
},
"userProperties": [],
"typeProperties": {
"source": {
"type": "DelimitedTextSource",
"storeSettings": {
"type": "AzureBlobStorageReadSettings",
"recursive": true,
"wildcardFolderPath": "AAA",
"wildcardFileName": {
"value": "@concat('User_*.csv')",
"type": "Expression"
},
"enablePartitionDiscovery": false
},
"formatSettings": {
"type": "DelimitedTextReadSettings"
}
},
"dataset": {
"referenceName": "AZURE_BLOB_CSV",
"type": "DatasetReference",
"parameters": {
"ContainerName": "test",
"DirectoryPath": "AAA",
"FileName": {
"value": "@concat('User_*.csv')",
"type": "Expression"
}
}
},
"firstRowOnly": false
}
},
{
"name": "ForEach UPDATE Date",
"type": "ForEach",
"dependsOn": [
{
"activity": "Lookup_Data",
"dependencyConditions": [
"Succeeded"
]
}
],
"userProperties": [],
"typeProperties": {
"items": {
"value": "@activity('Lookup_Data').output.value",
"type": "Expression"
},
"activities": [
{
"name": "Azure_Function_SkipHoliday",
"type": "AzureFunctionActivity",
"dependsOn": [],
"policy": {
"timeout": "0.12:00:00",
"retry": 0,
"retryIntervalInSeconds": 30,
"secureOutput": false,
"secureInput": false
},
"userProperties": [],
"typeProperties": {
"functionName": "Http_skip_holiday",
"method": "POST",
"body": {
"value": "@concat('{\"lo_date\":\"',item().inputdate,'\",\"skipday\":',item().skipday,'}')",
"type": "Expression"
}
},
"linkedServiceName": {
"referenceName": "AzureFunction_LinkService",
"type": "LinkedServiceReference"
}
}
]
}
}
],
"annotations": []
}
}

点击 Debug 进行调试

三,结尾

  Azure Data Factory(ADF)是Azure中的托管数据集成服务,允许我们迭代地构建、编排和监视您的ETL工作流程。Azure Functions现在已与ADF集成,允许我们在数据工厂管道中运行Azure函数作为步骤。大家多多练习!!!

 

作者:Allen

版权:转载请在文章明显位置注明作者及出处。如发现错误,欢迎批评指正。

Azure Data Factory(十二)传参调用 Azure Function的更多相关文章

  1. Azure Data Factory(二)复制数据

    一,引言 上一篇主要只讲了Azure Data Factory的一些主要概念,今天开始新的内容,我们开始通过Azure DevOps 或者 git 管理 Azure Data Factory 中的源代 ...

  2. ADF 第一篇:Azure Data Factory介绍

    Azure Data Factory(简写 ADF)是Azure的云ETL服务,简单的说,就是云上的SSIS.ADF是基于云的ETL,用于数据集成和数据转换,不需要代码,直接通过UI(code-fre ...

  3. Azure Data Factory(三)集成 Azure Devops 实现CI/CD

    一,引言 由于上一节文章内容过长,无法分享Azure Data Factory 的持续集成,持续发布.今天将着重介绍一下在使用 Azure DevOps Pipeline 发布,自动进行持续集成,并且 ...

  4. Azure Data Factory(四)集成 Logic App 的邮件通知提醒

    一,引言 上一篇有介绍到使用Azure Data Factory 复制数据,然后有集成 Azure DevOps 实现CI/CD,但是对于真正的项目来说,这些肯定是不够的,比如说在执行 Azure P ...

  5. Azure Data Factory(五)Blob Storage 密钥管理问题

    一,引言 之前讲解的ADF 集成Azure DevOps 实现CI/CD,在 Releases Pipeline 阶段,我们是将两个 Blob Storage 的链接字符串复制.粘贴到 "O ...

  6. Azure Terraform(十二)利用 Terraform 将文件上传到 Azure Blob Storage

    一,引言 本篇文章中,我门将学习如何利用 Terraform 将 文件以及文件夹上传到 Azure Blob Storage,这个对于我们来说很方便,可以将一些不重要的内容也存储在源代码管理工具中! ...

  7. # Python第十节 传参

    Python第十节 传参 一. 变量和变量名 首先说明变量名和变量的一点差异 例如: var = [1, 2, 3] `var = "Google" 调用变量var的时候, 既可以 ...

  8. 使用java传参调用exe并且获取程序进度和返回结果的一种方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在某个项目中需要考虑使用java后台调用由C#编写的切图程序( ...

  9. Azure Data Factory(一)入门简介

    一,引言 今天分享一个新的Azure 服务-----Azure Data Factory(Azure 数据工厂),怎么理解,参考根据官方解释-----数据工厂解释:大数据需要可以启用协调和操作过程以将 ...

  10. JVM(十二):方法调用

    JVM(十二):方法调用 在 JVM(七):JVM内存结构 中,我们说到了方法执行在何种内存结构上执行:Java 方法活动在虚拟机栈中的栈帧上,栈帧的具体结构在内存结构中已经详细讲解过了,下面就让我们 ...

随机推荐

  1. CompletableFuture 使用详解

    CompletableFuture 使用详解 1. runAsync 和 supplyAsync方法 CompletableFuture 提供了四个静态方法来创建一个异步操作. public stat ...

  2. OpenSCA用开源的方式做开源风险治理:Why? What? How?

    随着容器.微服务等新技术的快速迭代,开源软件已成为业界主流形态,开源和云原生时代的到来导致软件供应链越来越趋于复杂化和多样化,网络攻击者开始采用软件供应链攻击作为击破关键基础设施的的重要突破口,从而导 ...

  3. location对象的方法

    location.assign() 跟href一样,可以跳转页面(也称为重定向页面). location.replace() 替换当前页面,因为不记录历史,所以不能后退页面. location.rel ...

  4. freeswitch两个DTMF转换接口的区别

    概述 freeswitch支持三种模式的DTMF传输方式,分别时inband.INFO.2833. 在传统的PSTN网络中,所有的DTMF码都是inband模式,所以VOIP网络和PSTN网络对接中, ...

  5. Linux环境下如何查看Python版本号

    方法一.直接执行命令python,就可以查看python的版本信息. 退出用exit() 方法二.利用命令python -V,注意V要大写. 方法三.利用命令whereis python,注意wher ...

  6. MyBatis_问题解决:Invalid bound statement (not found)

    Invalid bound statement (not found)问题,即在mybatis中dao接口与mapper配置文件在做映射绑定的时候出现问题,简单说,就是接口与xml要么是找不到,要么是 ...

  7. web-云部署上线

  8. Oracle 专用模式与共享模式的学习与思考

    Oracle 专用模式与共享模式的学习与思考 说明 Oracle数据库中的专用模式和共享模式是两种不同的数据库运行模式,它们在应用场景和权限管理上有所不同. 专用模式(Dedicated Mode): ...

  9. [转帖]TiDB的tikv节点的压缩算法

    简介:TiDB的tikv节点实用的RocksDB,RocksDB的默认压缩算法为:[no:no:lz4:lz4:lz4:zstd:zstd] RocksDB 每一层数据的压缩方式,可选的值为:no,s ...

  10. [转帖]Kafka故障之磁盘打满

    https://www.jianshu.com/p/095e820361ae 问:磁盘打满扩容后能正常重启吗?答:不一定 要看文件格式是否损坏(log.index等).如果损坏会报错:index fi ...