Oracle cdc 2.3版本,在jsondebezium反序列化这块,deserialize方法传参sourcerecord 这里读取的oracle 数据,number类型的0值,变成0E-8的科学计数法,后面再识别的时候直接识别成string 这块改怎么处理?
Oracle cdc 2.3版本,在jsondebezium反序列化这块,deserialize方?[阿里云实时计算 Flink版]
「点点赞赏,手留余香」
还没有人赞赏,快来当第一个赞赏的人吧!
Oracle cdc 2.3版本,在jsondebezium反序列化这块,deserialize方法传参sourcerecord 这里读取的oracle 数据,number类型的0值,变成0E-8的科学计数法,后面再识别的时候直接识别成string 这块改怎么处理?
在 Flink CDC 的 Oracle Connector 中,使用 JSON 格式进行反序列化时,可能会遇到将 Number 类型的 0 值转换成科学计数法表示的问题。为了解决这个问题,您可以考虑使用自定义的反序列化器来将科学计数法表示的数值转换回正确的 Number 类型。
下面是一个示例的自定义反序列化器的代码:
在上面的示例中,我们通过正则表达式将科学计数法表示的数值转换回正确的 Number 类型。然后,使用 ObjectMapper 将 JSON 字符串转换成 Flink 的 Row 类型。您可以根据实际情况进行调整和修改。
如果您认为这个问题是一个需要改进的 bug 或者功能需求,您可以向 Flink CDC 社区提交一个 issue,描述您遇到的问题和建议。社区的开发人员将考虑并处理您的反馈
Number 类型的 0 值时,将其转换成了科学计数法表示,并使用 String 类型进行存储所导致的。这种情况下,您可以考虑使用自定义的反序列化器来解决该问题。
在 Flink CDC 中,可以使用 Debezium JSON 格式作为 CDC 数据的输出格式。在 Debezium JSON 格式中,Oracle CDC Connector 将 Number 类型的 0 值转换成科学计数法表示,并使用 String 类型进行存储。这可能会影响后续的数据处理和分析。为了解决该问题,您可以自定义一个反序列化器,将 String 类型的科学计数法表示的数值转换成正确的 Number 类型。
下面是一个自定义反序列化器的例子:
java
Copy
public class MyDeserializer implements DeserializationSchema {
@Override
public Row deserialize(byte[] message) throws IOException {
String str = new String(message, StandardCharsets.UTF_8);
// 将科学计数法表示的数值转换成正确的 Number 类型
str = str.replaceAll(“([+-]?d+)(.d+)?([eE][+-]?d+)?”, “$1”);
ObjectMapper mapper = new ObjectMapper();
JsonNode json = mapper.readTree(str);
// 将 JSON 转换成 Flink 的 Row 类型
// …
}
}
在上面的例子中,自定义的反序列化器将科学计数法表示的数值转换成正确的 Number 类型,并将 JSON 转换成 Flink 的 Row 类型。您可以根据实际情况进行调整和修改。
发现使用 jsondebezium 反序列化时,大家还是会碰到不少类型问题,SQL API使用的反序列化基本不会,我有个想法是在 jsondebezium的基础上参考 SQL API 改进下,这样可能大家试用datastream API会更好一些,你可以去社区开个issue嘛?可以指给,此回答整理自钉群“Flink CDC 社区”