修复flink-jdbc含有schema的表报不存在

在使用Flink 1.9.1版本读取PostgreSQL数据库时,遇到表不存在的错误。经过Debug发现,由于JDBCDialect类中quoteIdentifier()方法处理表名时,额外添加了引号导致问题。解决方案是对含schema的表名进行特殊处理,避免直接调用该方法。

博客背景

最近,使用flink读取postgresql的表数据时,代码一直报错,提示表不存在。通过debug发现,flink-jdbc的JDBCDialect类存在一点问题,现记录如下。

环境说明

flink版本:1.9.1
scala版本:2.12
postgresql数据库表结构:
ipark_datacenter:
​    --ods
        – t_test(id, name)

测试代码

import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
import org.apache.flink.api.common.typeinfo.SqlTimeTypeInfo;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.java.io.jdbc.JDBCAppendTableSink;
import org.apache.flink.api.java.io.jdbc.JDBCOptions;
import org.apache.flink.api.java.io.jdbc.JDBCTableSource;
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.TableSchema;
import org.apache.flink.table.api.java.StreamTableEnvironment;
import org.apache.flink.table.descriptors.Json;
import org.apache.flink.table.descriptors.Kafka;
import org.apache.flink.table.descriptors.Rowtime;
import org.apache.flink.table.descriptors.Schema;
import org.apache.flink.table.types.DataType;
import org.apache.flink.table.types.utils.TypeConversions;
import org.apache.flink.types.Row;

/**
 * @Author: maozl
 * @Date: 2019/10/17 17:14
 * @Description:
 */
public class FlinkJdbcDialectBugShow {
   
   

    public static void main(String[] args) throws Exception {
   
   
        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironment();
        StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);

        //jdbc
        JDBCOptions jdbcOptions = JDBCOptions.builder()
                .setDriverName("org.postgresql.Driver")
                .setDBUrl("jdbc:postgresql://127.0.0.1:65432/ipark_datacenter")
                .setUsername("root")
                .setPassword("admin")
                .setTableName("ods.t_test")
                .build();
        TableSchema tableSchema = TableSchema.builder()
                .fields(new String[]{
   
   "id", "name"}, new DataType[]{
   
   TypeConversions.fromLegacyInfoToDataType(BasicTypeInfo.INT_TYPE_INFO), TypeConversions.fromLegacyInfoToDataType
Flink 是一个开源的流处理框架,`flink-connector-jdbc` 是 Flink 提供的用于连接 JDBC 数据源的连接器。以下是关于 `flink-connector-jdbc` 的 jar 包的一些信息: ### Maven 依赖 若使用 Maven 构建项目,可在 `pom.xml` 里添加如下依赖: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-jdbc_2.12</artifactId> <version>1.13.2</version> </dependency> ``` 这里的版本号 `1.13.2` 可依据自身 Flink 版本进行调整。 ### Gradle 依赖 若使用 Gradle 构建项目,可在 `build.gradle` 中添加如下依赖: ```groovy implementation 'org.apache.flink:flink-connector-jdbc_2.12:1.13.2' ``` 同样,版本号需根据实际的 Flink 版本修改。 ### 手动下载 也能从 Maven 中央仓库手动下载 `flink-connector-jdbc` 的 jar 包。访问 [Maven 中央仓库](https://search.maven.org/),搜索 `flink-connector-jdbc`,选择合适的版本并下载对应的 jar 包。 ### 功能与用途 `flink-connector-jdbc` 这个 jar 包可让 Flink 与各类支持 JDBC 的数据库(像 MySQL、PostgreSQL、Oracle 等)进行交互,能够从数据库读取数据,也能将处理后的数据写入数据库。 ### 使用示例 以下是使用 `flink-connector-jdbc` 从 MySQL 数据库读取数据的简单示例: ```java import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.connector.jdbc.JdbcSource; import org.apache.flink.connector.jdbc.JdbcConnectionOptions; import org.apache.flink.connector.jdbc.JdbcInputFormat; import org.apache.flink.connector.jdbc.JdbcStatementBuilder; import java.sql.PreparedStatement; import java.sql.SQLException; public class FlinkJdbcExample { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<Tuple2<Integer, String>> stream = env.createInput( JdbcSource.<Tuple2<Integer, String>>jdbcSource( "jdbc:mysql://localhost:3306/test", "SELECT id, name FROM users", new JdbcStatementBuilder<Tuple2<Integer, String>>() { @Override public void accept(PreparedStatement preparedStatement, Tuple2<Integer, String> integerStringTuple2) throws SQLException { // 这里需要设置参数,因为是查询语句 } }, (resultSet, row) -> new Tuple2<>(resultSet.getInt(1), resultSet.getString(2)), new JdbcConnectionOptions.JdbcConnectionOptionsBuilder() .withDriverName("com.mysql.cj.jdbc.Driver") .withUsername("root") .withPassword("password") .build() ) ); stream.print(); env.execute("Flink JDBC Example"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值