如何用Azure Data Factory验证定长文本文件并导入有效数据?
用Azure Data Factory直接实现定长文件校验与明细导入
完全可以不用先插入数据库再通过存储过程校验,直接在ADF内完成校验逻辑并仅导入目标记录,具体实现步骤如下:
一、文件校验和校验(前置步骤)
- 配置Blob数据集的校验和:在指向目标定长文件的Blob数据集中,启用校验和计算(比如MD5),确保数据集能返回文件的哈希值。
- 获取文件校验和并验证:
- 在管道中添加获取元数据活动,选择上述Blob数据集,勾选
MD5字段(或对应校验和类型)。 - 添加如果条件活动,将获取到的校验和与预先存储的正确值(可存在Azure Key Vault或数据库配置表中)进行比对。若不匹配,直接终止管道并抛出错误;若匹配,继续执行后续流程。
- 在管道中添加获取元数据活动,选择上述Blob数据集,勾选
二、数据流内完成记录校验与筛选导入
使用ADF数据流处理文件内容,同时完成尾记录总数校验和明细筛选:
- 读取定长文件:
- 创建数据流,源数据集选择目标Blob文件,格式设为文本格式,列分隔符选择“无”,行分隔符用默认换行,这样每行会被读取为单个字符串列(命名为
raw_line)。
- 创建数据流,源数据集选择目标Blob文件,格式设为文本格式,列分隔符选择“无”,行分隔符用默认换行,这样每行会被读取为单个字符串列(命名为
- 拆分记录分支:
- 添加分支转换,将读取到的行拆分为三个分支:
- 头记录分支:筛选
raw_line startsWith '0'的行(仅用于日志或额外处理,可不导入) - 明细记录分支:筛选
raw_line startsWith '1'的行(后续要导入的目标数据) - 尾记录分支:筛选
raw_line startsWith '2'的行(用于总数校验)
- 头记录分支:筛选
- 添加分支转换,将读取到的行拆分为三个分支:
- 校验明细记录数量与尾记录一致:
- 在明细分支添加聚合转换,统计行数并命名为
actual_count(表达式:count(1))。 - 在尾记录分支添加派生列转换,提取尾记录中的数字部分并转为整数:
expected_count = toInteger(substring(raw_line, 2, length(raw_line)-1))。 - 添加Join转换,将聚合后的明细数量分支与尾记录分支进行无关联键的笛卡尔积连接(因为只有一行尾记录和一行聚合结果)。
- 添加条件拆分转换,判断
actual_count == expected_count:- 匹配的分支:继续处理明细记录
- 不匹配的分支:导向错误流,设置该分支的处理规则为“失败”,触发数据流终止。
- 在明细分支添加聚合转换,统计行数并命名为
- 处理并导入明细记录:
- 在匹配的分支中,添加派生列转换,提取用户名:
username = substring(raw_line, 2, length(raw_line)-1)(因为行首是'1',去掉第一个字符即为用户名)。 - 添加目标数据集指向SQL数据库的对应表,映射派生的
username字段,完成导入。
- 在匹配的分支中,添加派生列转换,提取用户名:
三、管道执行逻辑
将上述步骤整合为管道流程:
- 执行校验和验证活动
- 校验通过后,执行数据流活动
- 数据流执行成功则完成导入,失败则终止管道并报警
内容的提问来源于stack exchange,提问作者Mia
相关产品推荐
相关产品推荐

