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

这个id应该是数值类型,用在flink 中用bigint会报错,用string后,才发现字段值是这种

用sql-client 建oracle cdc 表查询 image.png

展开
收起
游客6vdkhpqtie2h2 2022-09-23 10:17:24 1289 0
11 条回答
写回答
取消 提交回答
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    在使用 Flink SQL 直接查询 Oracle CDC 表时,得到的 id 字段的数据类型可能是字符串类型(VARCHAR2),这就需要在 Flink 中使用字符串类型来接收该字段。不过,如果您需要将 id 字段用作 JOIN、聚合等操作,或者需要将其与其他整型字段进行运算或比较,那么您可以在查询时将其转换为整型类型。

    在 Flink SQL 中,可以使用 CAST 函数将字段转换为指定的数据类型。例如,可以使用以下语句将 id 字段转换为 BIGINT 类型:

    SELECT CAST(id AS BIGINT), name, age, gender, city FROM my_table;
    

    这样,查询结果中的 id 字段就变成了整型(BIGINT)类型。

    需要注意的是,在将字符串类型的字段转换为整型类型时,如果字段中包含非数字字符,可能会出现转换异常。这时可以使用 TRY_CAST 函数,它将尝试将字段转换为指定类型,如果无法转换,就返回 NULL。例如,可以使用以下语句查询 id 字段,并使用 TRY_CAST 将其转换为 BIGINT 类型:

    SELECT TRY_CAST(id AS BIGINT), name, age, gender, city FROM my_table;
    

    这种方式可以避免由于类型转换异常而导致查询失败的问题。

    2023-05-05 20:33:25
    赞同 展开评论 打赏
  • 从事java行业9年至今,热爱技术,热爱以博文记录日常工作,csdn博主,座右铭是:让技术不再枯燥,让每一位技术人爱上技术

    实时计算Flink版未提供官方内置Oracle CDC Connector,如需使用,可以通过管理自定义Connectors来实现,看到你使用的sql client,那么就需要考虑字段类型匹配的问题,Oracle 中没有BIGINT类型,但是可以用NUMBER类型来替换,因此你可以将BIGINT转化为Oracle可以识别的类型来操作。

    2023-05-04 16:33:49
    赞同 展开评论 打赏
  • 这个问题可能是因为Oracle CDC的表中,某些列的数据类型与SQL client中定义的数据类型不匹配所导致的。在Oracle中,数值类型的数据类型包括NUMBER、BINARY_FLOAT、BINARY_DOUBLE等,而SQL client中的bigint可能无法与这些数据类型匹配。因此,建议将数据类型改为字符串类型(VARCHAR、CHAR等),并在查询时转换为数值类型,例如使用CAST函数。

    示例代码:

    CREATE TABLE cdc_table (
      id VARCHAR(20),
      name VARCHAR(50),
      age VARCHAR(10)
    );
    
    SELECT id, name, CAST(age AS NUMBER) FROM cdc_table;
    

    这样就可以避免数据类型不匹配的问题,并正确地查询Oracle CDC表中的数值类型数据。

    2023-05-02 07:52:38
    赞同 展开评论 打赏
  • 云端行者觅知音, 技术前沿我独行。 前言探索无边界, 阿里风光引我情。

    在Flink中,如果使用bigint类型来表示id字段,可能会导致数据类型不匹配的错误。这是因为在Flink中,bigint类型对应的是Java中的long类型,而int类型对应的是Java中的int类型。如果将bigint类型的数据赋值给int类型的变量,可能会导致数据溢出或精度丢失,从而导致程序出错。

    为了避免这种情况,可以将id字段的数据类型设置为string类型。string类型可以表示任意长度的字符串,可以避免数据溢出或精度丢失的问题。同时,在Flink中,string类型也是一种常用的数据类型,可以方便地进行数据处理和转换。

    将id字段的数据类型设置为string类型可能会导致一些性能上的损失,因为字符串类型的比较和排序通常比整数类型的比较和排序要慢。因此,在实际应用中,需要根据具体情况来选择合适的数据类型,以达到最优的性能和准确性。

    2023-04-27 18:22:26
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    如果你的id字段是数值类型的,在使用 Flink 的 Oracle CDC 模块建表时,建议使用 DECIMAL 类型。

    例如,在建立 Oracle CDC 表时,使用以下 SQL 语句,其中 id 字段是 DECIMAL 类型:

    CREATE TABLE oracle_cdc_table ( id DECIMAL(19,0), ... ) 在查询该表时,调用 id 值时,可以将其转换为字符串类型,例如:

    SELECT TO_CHAR(id) FROM oracle_cdc_table ... 这样可以将 DECIMAL 类型的 id 字段作为字符串使用,避免在 Flink 中使用 BIGINT 类型时出现错误。

    2023-04-26 12:35:51
    赞同 展开评论 打赏
  • 天下风云出我辈,一入江湖岁月催,皇图霸业谈笑中,不胜人生一场醉。

    这个问题可能涉及到数据类型匹配的问题。在 Flink 中,bigint 类型对应 Java 中的 long 类型,可用于存储 64 位的整数。如果数据源中的 id 字段是数值类型,可以将其声明为 BIGINT 类型。

    例如,以下是一个声明 BIGINT 类型的 Flink SQL 示例:

    sql

    CREATE TABLE myTable ( id BIGINT, name STRING, age INT ) WITH ( ... );

    如果使用 BIGINT 类型仍然出现报错的情况,可以检查数据源中的 id 字段是否有超出 BIGINT 类型所能表示的范围。此时可以考虑使用字符串类型来存储 id 字段,因为字符串类型可以存储任意长度的字符。

    以下是一个使用 STRING 类型的 Flink SQL 示例:

    sql

    CREATE TABLE myTable ( id STRING, name STRING, age INT ) WITH ( ... );

    需要注意的是,如果使用 STRING 类型来存储 id 字段,需要确保所有查询和计算都使用字符串比较和转换函数。因为字符串类型的数据是按照字典顺序进行比较和排序的,而不是按照数字大小进行比较和排序的。

    2023-04-26 09:35:36
    赞同 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    楼主你好,根据你的错误提示可知,是数据类型不匹配导致的报错,你可以在使用这个数据类型的时候进行转换即可。

    2023-04-25 08:46:09
    赞同 展开评论 打赏
  • 根据您提供的信息,这个 ID 字段的值是一个 byte 数组,因此在 Flink 中需要将其转换为合适的类型。通常情况下,ID 字段应该是一个数值类型,例如 bigint、int、long 等,但是在您的情况下,由于字段值是一个 byte 数组,因此需要将其转换为字符串类型,然后再进行解析。

    以下是一个示例代码,用于将 byte 数组转换为字符串类型,并将其解析为 long 类型:

    public class IdConverter implements MapFunction<Row, Long> {
        @Override
        public Long map(Row row) throws Exception {
            byte[] bytes = (byte[]) row.getField(0);
            String str = new String(bytes, StandardCharsets.UTF_8);
            return Long.parseLong(str, 16);
        }
    }
    

    在上述代码中,我们定义了一个 IdConverter 类,实现了 Flink 的 MapFunction 接口,将 byte 数组转换为 long 类型。在 map 方法中,我们首先将 byte 数组转换为字符串类型,然后使用 Long.parseLong 方法将其解析为 long 类型。由于 ID 字段的值是十六进制表示的字符串,因此我们将字符串的基数设置为 16。

    您可以通过将上述代码应用到 Flink 的 DataStream 中来将 ID 字段转换为 long 类型:

    DataStream<Row> stream = ...; // 输入数据流
    DataStream<Long> idStream = stream.map(new IdConverter()); // 将 ID 字段转换为 long 类型
    

    请注意,由于 ID 字段的值是一个字符串类型,因此需要确保该字符串表示的数字不会超出 long 类型的范围。如果超出范围,则可能会导致解析错误或数据截断。

    2023-04-24 14:05:56
    赞同 展开评论 打赏
  • 全栈JAVA领域创作者

    根据您提供的信息,看起来您的字段值实际上是16进制格式的字符串,而不是数值类型。如果您想将其作为字符串处理,可以使用String类型来定义该字段。如果您想将其转换为数值类型,则可以使用转换函数进行转换。在 Flink SQL 中,您可以使用 CAST 函数将字符串转换为数值类型,例如:CAST(field_name AS BIGINT). 在 Oracle 中,您可以使用 TO_NUMBER 函数将16进制格式的字符串转换为数值类型,例如:TO_NUMBER(field_name, 'XXXXXXXXXXXXXXXX'),其中 XXXXXXXXXXXXXXXX 是16进制字符串的格式。

    2023-04-23 22:32:38
    赞同 展开评论 打赏
  • 热爱开发

    如果您在使用 Flink 的 SQL API 时遇到了类似的问题,可能是由于数据类型不匹配造成的。在 Flink 中,BIGINT 和 LONG 类型一般用于表示整数值,如果使用 BIGINT 类型来表示字符串类型的值,可能导致类型转换错误。

    如果您需要处理字符串类型的数据,可以使用 VARCHAR 或 STRING 类型。例如:

    CREATE TABLE MyTable ( id VARCHAR, name STRING, event_time TIMESTAMP(3), WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND -- 指定水印 ) WITH ( 'connector.type' = 'kafka', 'connector.version' = 'universal', 'connector.topic' = 'my_topic', 'connector.startup-mode' = 'earliest-offset', 'connector.properties.zookeeper.connect' = 'localhost:2181', 'connector.properties.bootstrap.servers' = 'localhost:9092', 'format.type' = 'json' ); 在上述代码中,我们将 id 字段的数据类型修改为 VARCHAR 类型,以便正确处理字符串类型的数据。同时,为了在 Flink 中支持 Oracle CDC 表查询操作,您还需要安装相应的 Oracle Connector 插件,并且在创建表格时设置相应的选项。例如:

    CREATE TABLE MyOracleTable ( id VARCHAR, name VARCHAR, age INTEGER, PRIMARY KEY (id) ) WITH ( 'connector' = 'oracle-cdc', 'jdbc.url' = 'jdbc:oracle:thin:@//host:port/service_name', 'jdbc.username' = 'username', 'jdbc.password' = 'password', 'table-name' = 'my_table', 'debezium.schema-include' = '.*' ); 在上述代码中,我们使用 oracle-cdc 连接器连接到 Oracle 数据库,并创建一个名为 MyOracleTable 的表格,其中 id 字段的数据类型为 VARCHAR 类型。需要注意的是,oracle-cdc 连接器依赖于 Debezium 库,因此您还需要安装相应的 Debezium Connector 插件。

    2023-04-23 17:34:45
    赞同 展开评论 打赏
  • Flink 中 bigint 类型无法匹配 Oracle 的数据类型 NUMBER(38,0) 的问题,是因为在 Flink 中,bigint 类型的值范围是从 -9223372036854775808 到 9223372036854775807,而 Oracle 的 NUMBER 类型的取值范围可达到 10^38 - 1,因此需要将 Flink 中的 bigint 类型转换为 Oracle 中的 NUMBER 类型。可以使用 Flink SQL 中的 CAST 函数来实现类型转换,例如:

    SELECT CAST(id AS NUMERIC(38,0)), name, age FROM MyTable; 在上述代码中,我们通过 CAST 函数将 id 列转换为了 NUMERIC(38,0) 类型,同时保留了 name 和 age 两列的原始类型。

    2023-04-23 17:05:06
    赞同 展开评论 打赏
滑动查看更多

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

相关产品

  • 实时计算 Flink版
  • 相关电子书

    更多
    Flink CDC Meetup PPT - 龚中强 立即下载
    Flink CDC Meetup PPT - 王赫 立即下载
    Flink CDC Meetup PPT - 覃立辉 立即下载