为 Avro 架构创建十进制逻辑类型和字节类型创建 JSON 表示形式



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

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

价值

"score":3.4,

我收到异常

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":"u00fau00cfu00e0",

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

用于将 BigDecimal 转换为 json 的 Scala 函数,以便 avro 能够理解它

def toJsonString(value: java.math.BigDecimal): String = {
val bytes = value.unscaledValue().toByteArray
bytes
.map(_.formatted("\u%04x"))
.mkString
}

相关内容

  • 没有找到相关文章

最新更新