Azure Data Factory Excel管道两大问题求助:空行过滤与空值转换
问题1:跳过Lookup返回的全Null空行
方案1:用Filter活动直接过滤(无需Data Flow)
在Lookup活动和ForEach活动之间添加一个Filter活动:
- 设置Items为Lookup的输出数组:
@activity('Lookup活动名称').output.value - 设置Condition为判断当前行是否存在非Null字段,示例表达式:
该条件会保留至少一个字段不为Null的行,自动过滤全Null的空行。@or(not(equals(item().sampleId, null)), not(equals(item().parameterId, null)), not(equals(item().resultText, null)), not(equals(item().resultSymbol, null)), not(equals(item().resultNumber, null)))
方案2:用Data Flow过滤(解决Schema为空的问题)
若必须使用Data Flow,先解决Schema无法加载的问题:
- 临时将Excel数据集的文件名改为静态测试文件(确保文件包含完整表头和有效数据),此时Data Flow的Input schema会自动加载列信息。
- 添加Select活动完成列重命名(若需要),再添加Filter活动,设置过滤条件:
isNotNull(sampleId) || isNotNull(parameterId) || isNotNull(resultText) || isNotNull(resultSymbol) || isNotNull(resultNumber) - 配置完成后,将Excel数据集改回动态参数的文件名即可。
问题2:空字符串转Decimal类型时的报错处理
报错原因是空字符串''无法直接转换为Decimal类型,即使SQL列允许Null,也需要先将空字符串转为Null值。
方法1:修改TabularTranslator映射
在typeConversionSettings中添加convertEmptyStringToNull: true参数,修改后的完整映射如下:
@json(' { "type": "TabularTranslator", "mappings": [ { "source": { "name": "sampleId" }, "sink": { "name": "sample_id", "physicalType": "int" } }, { "source": { "name": "parameterId" }, "sink": { "name": "parameter_id", "physicalType": "int" } }, { "source": { "name": "resultText" }, "sink": { "name": "result_text", "physicalType": "varchar", "nullValue": "null" } }, { "source": { "name": "resultSymbol" }, "sink": { "name": "result_symbol", "physicalType": "varchar", "nullValue": "null" } }, { "source": { "name": "resultNumber" }, "sink": { "name": "result_number", "physicalType": "decimal", "nullValue": "null" } } ], "typeConversion": true, "typeConversionSettings": { "allowDataTruncation": true, "treatBooleanAsNumber": false, "convertEmptyStringToNull": true } } ')
该参数会自动将所有空字符串转换为Null值,Decimal类型转换时就不会报错,最终插入SQL的就是Null值。
方法2:Data Flow派生列处理
在Data Flow中添加派生列活动,对resultNumber字段单独处理:
iif(resultNumber == '', null(), resultNumber)
将空字符串强制转为Null后,再复制到SQL表即可。
内容的提问来源于stack exchange,提问作者Deffo
相关产品推荐
相关产品推荐

