如何在Azure Data Factory中正确解析JSON的decimal类型?
Azure Data Flow解析JSON中.NET Decimal类型Amount字段的正确方案
问题场景
我在Azure SQL数据库中有一张表,某列包含如下JSON字符串:
{"Id":"4b11c702-d4b2-47f4-a8d6-0b8ab9f53c99","Date":"2021-11-15T00:16:43.7300189+00:00","Source":"AtlasEarth","SourceTransactionId":"5ad129d3-2b79-44b1-b617-2d86d352003a","SourceTransactionType":"Rent","Amount":0.000000000000000111}
作为Azure Data Flow的一部分,我尝试解析该JSON字符串并将部分属性存入复杂对象,大部分解析正常,但从.NET decimal属性序列化而来的Amount列格式错误,尝试float和double类型结果一致,请问如何获取该列的正确格式?
解决方案
float和double属于浮点数类型,无法精确存储高精度decimal值,会出现精度丢失或格式异常。针对该场景可通过以下两种方式处理:
1. 直接使用Decimal类型解析(推荐)
在Azure Data Flow的JSON解析配置中,为Amount字段指定decimal类型:
- 打开Data Flow中的解析JSON转换组件
- 在「结构(Schema)」配置里找到
Amount字段,将数据类型修改为decimal,建议选择decimal(38,18)以覆盖.NET decimal的精度范围 - 保存配置后重新运行数据流,即可精确解析该字段值。
2. 先按字符串解析再转换为Decimal
如果直接指定decimal类型仍有问题,可分两步处理:
- 解析JSON时,将
Amount的类型设为string - 添加派生列转换组件,使用表达式
toDecimal(Amount, 38, 18)将字符串转换为高精度decimal类型 - 替换原Amount字段或生成新字段使用。
补充说明
.NET的decimal类型精度最高可达28-29位有效数字,Azure Data Flow中的decimal(38,18)类型完全可以覆盖其精度需求,从根源上避免浮点数类型带来的精度丢失问题。
内容的提问来源于stack exchange,提问作者Gutemberg Ribeiro
相关产品推荐
相关产品推荐

