首页 > 解决方案 > 将 BigDecimal 放入 Avro Decimal

问题描述

作为用户,需求很明确。我有一个 Avro 逻辑类型 Decimal(20,3) 的记录,并想在其中输入一个值。所以我希望写

genericrecord.put("Quantity", 4.0);
genericrecord.put("Quantity", BigDecimal.valueOf(4.0));

从 Avro 实现的角度来看,Decimal() 数据类型是 Fixed 或 ByteArray,因此序列化程序需要两者中的任何一个,我需要将值转换为字节数组。

我发现最简单的方法是使用 DecimalConversion 类。

DecimalConversion DECIMAL_CONVERTER = new DecimalConversion();
Schema s = item.getSchema().getField("Quantity").schema();
Decimal l = (Decimal) s.getLogicalType();
BigDecimal d = BigDecimal.valueOf(4.0).setScale(l.getScale());
ByteBuffer value = DECIMAL_CONVERTER.toBytes(d, null, l);
item.put("Quantity", value);

找到 Quantity 列的 LogicalType。将双精度值 4.0 转换为 BigDecimal。将 BigDecimal 的比例与 LogicalType 匹配。将其转换为 ByteBuffer。将字节设置为值。

这对于一个简单的 item.put("Quantity", 4.0) 要求来说有点过分了。

如前所述,从库实现者的角度来看,一切都很清楚,但从用户的角度来看,不是很方便。

没有更好的选择吗?我在 LogicalType 类中发现了一些关于可插拔转换器的信息。任何提示你如何使用这些?我完全错过了什么吗???

提前致谢

PS:Avro 1.9.0

标签: javaavro

解决方案


推荐阅读