Azure Data Factory(十二)传参调用 Azure Function
一,引言
在实际的项目中,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的更多相关文章
- Azure Data Factory(二)复制数据
一,引言 上一篇主要只讲了Azure Data Factory的一些主要概念,今天开始新的内容,我们开始通过Azure DevOps 或者 git 管理 Azure Data Factory 中的源代 ...
- ADF 第一篇:Azure Data Factory介绍
Azure Data Factory(简写 ADF)是Azure的云ETL服务,简单的说,就是云上的SSIS.ADF是基于云的ETL,用于数据集成和数据转换,不需要代码,直接通过UI(code-fre ...
- Azure Data Factory(三)集成 Azure Devops 实现CI/CD
一,引言 由于上一节文章内容过长,无法分享Azure Data Factory 的持续集成,持续发布.今天将着重介绍一下在使用 Azure DevOps Pipeline 发布,自动进行持续集成,并且 ...
- Azure Data Factory(四)集成 Logic App 的邮件通知提醒
一,引言 上一篇有介绍到使用Azure Data Factory 复制数据,然后有集成 Azure DevOps 实现CI/CD,但是对于真正的项目来说,这些肯定是不够的,比如说在执行 Azure P ...
- Azure Data Factory(五)Blob Storage 密钥管理问题
一,引言 之前讲解的ADF 集成Azure DevOps 实现CI/CD,在 Releases Pipeline 阶段,我们是将两个 Blob Storage 的链接字符串复制.粘贴到 "O ...
- Azure Terraform(十二)利用 Terraform 将文件上传到 Azure Blob Storage
一,引言 本篇文章中,我门将学习如何利用 Terraform 将 文件以及文件夹上传到 Azure Blob Storage,这个对于我们来说很方便,可以将一些不重要的内容也存储在源代码管理工具中! ...
- # Python第十节 传参
Python第十节 传参 一. 变量和变量名 首先说明变量名和变量的一点差异 例如: var = [1, 2, 3] `var = "Google" 调用变量var的时候, 既可以 ...
- 使用java传参调用exe并且获取程序进度和返回结果的一种方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在某个项目中需要考虑使用java后台调用由C#编写的切图程序( ...
- Azure Data Factory(一)入门简介
一,引言 今天分享一个新的Azure 服务-----Azure Data Factory(Azure 数据工厂),怎么理解,参考根据官方解释-----数据工厂解释:大数据需要可以启用协调和操作过程以将 ...
- JVM(十二):方法调用
JVM(十二):方法调用 在 JVM(七):JVM内存结构 中,我们说到了方法执行在何种内存结构上执行:Java 方法活动在虚拟机栈中的栈帧上,栈帧的具体结构在内存结构中已经详细讲解过了,下面就让我们 ...
随机推荐
- 项目管理之问,ChatGPT作答
项目管理 帮我列一份<项目管理>的大纲 当然可以!以下是一个典型的<项目管理>大纲: I. 项目管理概述 A. 项目管理定义和目标 B. 项目管理的重要性和价值 C. 项目管理 ...
- C#设计模式16——中介者模式的写法
是什么: 中介者模式是一种行为型设计模式,它定义了一个中介者对象来封装一系列对象之间的交互.中介者模式可以使得对象间的交互更加松耦合,避免了对象之间的直接依赖,从而使系统更加灵活.易于扩展和维护. 为 ...
- Spring boot 自定义kafkaTemplate的bean实例进行生产消息和发送消息
本文为博主原创,未经允许不得转载: 目录: 1. 自定义生产消息 kafkaTemplate 实例 2. 封装 kafka 发送消息的service 方法 3. 测试 kafka 发送消息ser ...
- 如何安全的大数据量表在线进行DDL操作
本文为博主原创,转载请注明出处 随着业务的需要,工作中需要对生产数据库的一些表做一些DDL操作,由于生产数据库表的数据量都是几千万, 而且生产数据库的表还在不断的进行新增和查询操作.应用中需要对生产数 ...
- VSCode + GCC编译器(MinGW)开发环境中文字符乱码问题踩坑与解决办法
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- Docker-02应用部署案例
1.Docker部署mysql 拉取mysql镜像 # 查询mysql镜像 docker search mysql # 拉取镜像命令 docker pull centos/mysql-57-cento ...
- Python Code_06基础篇
条件表达式 # coding:utf-8 # author : 写bug的盼盼 # development time : 2021/8/28 7:38 num_a = input('请输入第一个整数' ...
- [转帖]Megacli 错误码
MegaCLI Error Messages 0x00 Command completed successfully 0x01 Invalid command 0x02 DCMD opcode is ...
- 【转帖】26.Java本地方法的理解(native方法)
目录 1.什么是本地方法? 2. 为什么要使用Native method? 1.什么是本地方法? 本地方法就是java代码里面写的native方法,它没有方法体.是为了调用C/C++代码而写的.在JN ...
- [转帖]人人都应该知道的CPU缓存运行效率
https://zhuanlan.zhihu.com/p/628017496 提到CPU性能,大部分同学想到的都是CPU利用率,这个指标确实应该首先被关注.但是除了利用率之外,还有很容易被人忽视的指标 ...