为 avro 模式的十进制逻辑类型和字节类型创建 json 表示
create json representation for decimal logical type and byte types for avro schema
我正在尝试根据以下 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":"\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
}
我正在尝试根据以下 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":"\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
}