gpt4 book ai didi

scala - 为 avro 架构的十进制逻辑类型和字节类型创建 json 表示

转载 作者:行者123 更新时间:2023-12-03 23:10:40 24 4
gpt4 key购买 nike

我正在尝试按照以下 avro 模式创建 JSON 字符串,用于十进制值。
https://avro.apache.org/docs/1.8.2/spec.html#Logical+Types

{
"name": "score",
"type": "bytes",
"logicalType": "decimal",
"precision": 10,
"scale": 5
}

值(value)
"score":3.4,

我得到了异常(exception)
Caused by: org.apache.avro.AvroTypeException: Expected bytes. Got VALUE_NUMBER_FLOAT.

如果我给出“\u0000”而不是 3.4,那么它可以工作,但这是 0 的表示,我将如何获得 3.4 的表示?
现在我正在创建硬编码的 JSON 字符串,但将来我必须将输出转换为十进制,我如何在 Scala 中做到这一点。

有没有办法将值转换为十进制逻辑格式?

最佳答案

java 代码:

byte[] score = new BigDecimal("3.40000").unscaledValue().tobyteArray();
for (byte b : score) {​
System.out.println(String.format("\\u%04x", b));
}

将打印出以下内容:
\u00fa
\u00cf
\u00e0

然后,您需要像这样编写 json 分数值:
"score":"\u00fa\u00cf\u00e0",

它应该转换为 3.40000。
原因 3. 40000 是因为架构中的“scale”值为 5。如果 scale 值为 2,那么我们将有 new BigDecimal("3.40")

用于将 BigDecimal 转换为 json 以便 avro 理解它的 Scala 函数
def toJsonString(value: java.math.BigDecimal): String = {
val bytes = value.unscaledValue().toByteArray
bytes
.map(_.formatted("\\u%04x"))
.mkString
}

关于scala - 为 avro 架构的十进制逻辑类型和字节类型创建 json 表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57995567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com