【问题标题】:Decimal number from JSON truncated when read from Mapping Data Flow从映射数据流读取时,JSON 中的十进制数被截断
【发布时间】:2021-03-05 16:52:21
【问题描述】:

使用映射数据流从 JSON 数据文件中读取十进制数字时,十进制数字会被截断。

[Source data]

{
    "value": 1123456789.12345678912345678912
}

在数据工厂中,源数据集配置为没有架构。映射数据流投影定义了具有足够精度和比例的十进制数据类型。

[Mapping Data Flow script]

source(output(
        value as decimal(35,20)
    ),
...

但是,在“数据预览”窗口中查看值或查看管道输出时,该值会被截断。

[Output]

1123456789.12345670000000000000

其他文件格式不会出现此问题,例如分隔文本。

从源数据集中预览数据时,十进制数字以相同的方式截断。无论是否设置了架构,都会发生这种情况。如果设置了模式,则数据类型为 number 而不是十进制,因为它是 JSON。 Mozilla Developer Network documentation 调用了浏览器支持的不同数量的十进制数字,所以我想知道这是否取决于所使用的 JSON 解析器。

这是预期的行为吗?使用 JSON 时,数据工厂是否可以配置为支持完整的小数位数?不幸的是,这让人质疑在数据工厂中执行聚合计算是否可行。

【问题讨论】:

    标签: azure-data-factory


    【解决方案1】:

    我创建了一个和你一样的测试,得到的结果如下:

    更改原始数据后,我在值上加上了双引号:

    然后我使用toDecimal(Value,35,20)将字符串类型转换为十进制类型:

    它似乎运作良好。所以我们可以得出结论:

    • 不要让 ADF 做默认数据类型转换,它会截断值的长度。
    • 其他文件格式不会出现此问题,例如分隔文本。因为默认值是字符串类型。

    【讨论】:

    • @joseph-xu 感谢您确认我遇到的问题。对源系统施加格式约束是一种选择,尽管在这种情况下存在问题。 Schema drift in source 文档表明数据应该以字符串形式到达,因为未定义架构 - “所有新检测到的列,称为漂移列,都以字符串数据类型形式到达”
    • @Tom 是的,没错。默认情况下它会以字符串数据类型到达,但是 ADF 做了强制类型转换导致精度损失。所以我们需要防止这种默认行为。
    • @Tom 如果我的回答对您有帮助,您可以接受它作为答案(单击答案旁边的复选标记,将其从灰色切换为已填充。)。这对其他社区成员可能是有益的。谢谢!
    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 2016-04-22
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多