开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

Oracle cdc 2.3版本,在jsondebezium反序列化这块,deserialize方?

Oracle cdc 2.3版本,在jsondebezium反序列化这块,deserialize方法传参sourcerecord 这里读取的oracle 数据,number类型的0值,变成0E-8的科学计数法,后面再识别的时候直接识别成string 这块改怎么处理?

展开
收起
真的很搞笑 2023-07-02 17:19:38 112 0
3 条回答
写回答
取消 提交回答
  • 在 Flink CDC 的 Oracle Connector 中,使用 JSON 格式进行反序列化时,可能会遇到将 Number 类型的 0 值转换成科学计数法表示的问题。为了解决这个问题,您可以考虑使用自定义的反序列化器来将科学计数法表示的数值转换回正确的 Number 类型。

    下面是一个示例的自定义反序列化器的代码:

    public class MyDeserializer implements DeserializationSchema<Row> {
        @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 类型
            // ...
        }
    
        @Override
        public boolean isEndOfStream(Row nextElement) {
            return false;
        }
    
        @Override
        public TypeInformation<Row> getProducedType() {
            // 返回自定义的 Row 类型
            // ...
        }
    }
    

    在上面的示例中,我们通过正则表达式将科学计数法表示的数值转换回正确的 Number 类型。然后,使用 ObjectMapper 将 JSON 字符串转换成 Flink 的 Row 类型。您可以根据实际情况进行调整和修改。

    如果您认为这个问题是一个需要改进的 bug 或者功能需求,您可以向 Flink CDC 社区提交一个 issue,描述您遇到的问题和建议。社区的开发人员将考虑并处理您的反馈

    2023-07-30 11:02:33
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    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 类型
    // ...
    }

    @Override
    public boolean isEndOfStream(Row nextElement) {
        return false;
    }
    
    @Override
    public TypeInformation<Row> getProducedType() {
        return null;
    }
    

    }
    在上面的例子中,自定义的反序列化器将科学计数法表示的数值转换成正确的 Number 类型,并将 JSON 转换成 Flink 的 Row 类型。您可以根据实际情况进行调整和修改。

    2023-07-30 10:05:39
    赞同 展开评论 打赏
  • 发现使用 jsondebezium 反序列化时,大家还是会碰到不少类型问题,SQL API使用的反序列化基本不会,我有个想法是在 jsondebezium的基础上参考 SQL API 改进下,这样可能大家试用datastream API会更好一些,你可以去社区开个issue嘛?可以指给,此回答整理自钉群“Flink CDC 社区”

    2023-07-02 17:32:59
    赞同 展开评论 打赏

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关电子书

更多
PostgresChina2018_樊文凯_ORACLE数据库和应用异构迁移最佳实践 立即下载
PostgresChina2018_王帅_从Oracle到PostgreSQL的数据迁移 立即下载
Oracle云上最佳实践 立即下载

相关镜像