当前位置: 首页 > 知识库问答 >
问题:

为十进制逻辑类型创建 json 表示形式,为 avro 架构创建字节类型

徐峰
2023-03-14

我正在尝试按照下面的avro架构创建JSON字符串,用于十进制值。https://avro.apache.org/docs/1.8.2/spec.html#Logical 类型

{
 "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”,它就可以工作,但这是0的表示,我将如何获得3.4的表示?现在我正在创建硬编码的JSON字符串,但将来我必须将输出转换为十进制,我如何在scala中做到这一点。

有没有办法把数值转换成十进制逻辑格式?

共有1个答案

王成化
2023-03-14

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.4000,是因为模式中的“scale”值为5。如果scale值为2,那么我们将有一个新的BigDecimal(“3.40”)

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

def toJsonString(value: java.math.BigDecimal): String = {
    val bytes = value.unscaledValue().toByteArray
    bytes
      .map(_.formatted("\\u%04x"))
      .mkString
}
 类似资料:
  • Navicat Data Modeler 让你创建逻辑模型,包括实体、属性和关系。 若要创建一个逻辑模型,从菜单栏选择“文件”->“新建”。在“新建模型”窗口中,选择“模型类型”为“逻辑”。 你也可以使用下列的功能来创建一个逻辑模型: 从数据库导入 - 从现有的数据库/模式或 ODBC 数据源逆向工程。 模型转换 - 从一个物理或概念模型转换。

  • Navicat Data Modeler 让你创建逻辑模型,包括实体、属性和关系。 若要创建一个逻辑模型,从菜单栏选择“文件”->“新建模型”。在“新建模型”窗口中,选择“模型类型”为“逻辑”。 你也可以使用下列的功能来创建一个逻辑模型: 从数据库导入 - 从现有的数据库/模式或 ODBC 数据源逆向工程。 模型转换 - 从一个物理或概念模型转换。

  • Navicat Premium 让你创建逻辑模型,包括实体、属性和关系。 在“新建模型”窗口中,选择“模型类型”为“逻辑”。

  • Navicat Premium 让你创建逻辑模型,包括实体、属性和关系。 在“新建模型”窗口中,选择“模型类型”为“逻辑”。

  • Navicat Premium 让你创建逻辑模型,包括实体、属性和关系。 在“新建模型”窗口中,选择“模型类型”为“逻辑”。

  • 问题内容: 考虑此类: 默认的字符串表示形式如下所示: 如何使它显示自定义字符串? 问题答案: 在类的元类中实现或。 使用,如果你说的是可读的字串,使用了明确的表示。