一,引言

在实际的项目中,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. [kuangbin] 专题13 基础计算几何 题解 + 总结

    kuangbin带你飞:点击进入新世界 [kuangbin] 专题7 线段树 题解 + 总结:https://www.cnblogs.com/RioTian/p/13413897.html kuang ...

  2. L2-010. 排座位(种类并查集)

    布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席. 输入格式: ...

  3. kafka集群四、权限增加ACL

    系列导航 一.kafka搭建-单机版 二.kafka搭建-集群搭建 三.kafka集群增加密码验证 四.kafka集群权限增加ACL 五.kafka集群__consumer_offsets副本数修改 ...

  4. 《3D编程模式》写书-第3次记录

    大家好,这段时间我完成了"积木模式"."管道模式"."多线程模式"."依赖隔离模式"的初稿 目前我已经完成了所有模式(7 ...

  5. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.27)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  6. ZHS16GBK字符集下面Oracle数据库varchar与nvarchar的验证

    ZHS16GBK字符集下面Oracle数据库varchar与nvarchar的验证 背景 周末分析了 SQLServer mysql等数据库 想着继续分析一下oracle数据库 这边oracle使用的 ...

  7. [转帖]Django10——从db.sqlite3迁移到MySQL

    https://blog.csdn.net/weixin_47197906/article/details/124889477 文章目录 1.查看Django支持的数据库 2.修改数据库配置 1.查看 ...

  8. [转帖]Oracle进程中的 LOCAL=NO 和 LOCAL=YES

    https://www.cnblogs.com/wjoyxt/p/3780860.html 我们在服务器上用sqlplus 连接数据库,在查看进程,会多出一条记录: oracle 16007 1600 ...

  9. github-keydb 知识

    https://github.com/Snapchat/KeyDB KeyDB is now a part of Snap Inc! Check out the announcement here R ...

  10. [转贴]一图弄懂ASCII、GB2312、GBK、GB18030编码

    一图弄懂ASCII.GB2312.GBK.GB18030编码 https://blog.csdn.net/LightUpHeaven/article/details/92008630 转载君子不器.  ...