java - 将 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