Flink SQL(三) 连接到外部系统System和JDBC

文件系统

​ 另一类非常常见的外部系统就是文件系统(File System)了。Flink 提供了文件系统的连 接器,支持从本地或者分布式的文件系统中读写数据。这个连接器是内置在 Flink 中的,所以使用它并不需要额外引入依赖。

​ 下面是一个连接到文件系统的示例:

CREATE TABLE MyTable (
 column_name1 INT,
 column_name2 STRING,
 ...
 part_name1 INT,
 part_name2 STRING
) PARTITIONED BY (part_name1, part_name2) WITH (
 'connector' = 'filesystem', -- 连接器类型
 'path' = '...', -- 文件路径
 'format' = '...' -- 文件格式
)

​ 这里在 WITH 前使用了 PARTITIONED BY 对数据进行了分区操作。文件系统连接器支持 对分区文件的访问。

JDBC

​ 关系型数据表本身就是 SQL 最初应用的地方,所以我们也会希望能直接向关系型数据库中读写表数据。Flink 提供的 JDBC 连接器可以通过 JDBC 驱动程序(driver)向任意的关系型 数据库读写数据,比如 MySQL、PostgreSQL、Derby 等。

​ 作为 TableSink 向数据库写入数据时,运行的模式取决于创建表的 DDL 是否定义了主键 (primary key)。如果有主键,那么 JDBC 连接器就将以更新插入(Upsert)模式运行,可以向外部数据库发送按照指定键(key)的更新(UPDATE)和删除(DELETE)操作,如果没有定义主键,那么就将在追加(Append)模式下运行,不支持更新和删除操作。

  1. 引入依赖

    想要在 Flink 程序中使用 JDBC 连接器,需要引入如下依赖:

    <dependency>
     <groupId>org.apache.flink</groupId>
     <artifactId>flink-connector-jdbc_${scala.binary.version}</artifactId>
     <version>${flink.version}</version>
    </dependency>
    

    此外,为了连接到特定的数据库,我们还用引入相关的驱动器依赖,比如 MySQL:

    <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.38</version>
    </dependency>
    
  2. 创建 JDBC 表

    创建 JDBC 表的方法与前面 Upsert Kafka 大同小异。下面是一个具体示例:

    -- 创建一张连接到 MySQL 的 表
    CREATE TABLE MyTable (
     id BIGINT,
     name STRING,
     age INT,
     status BOOLEAN,
     PRIMARY KEY (id) NOT ENFORCED
    ) WITH (
     'connector' = 'jdbc',
     'url' = 'jdbc:mysql://localhost:3306/mydatabase',
     'table-name' = 'users'
    );
    -- 将另一张表 T 的数据写入到 MyTable 表中
    INSERT INTO MyTable
    SELECT id, name, age, status FROM T;
    
    

    ​ 这里创建表的 DDL 中定义了主键,所以数据会以 Upsert 模式写入到 MySQL 表中;而到 MySQL 的连接,是通过 WITH 子句中的 url 定义的。要注意写入 MySQL 中真正的表名称是 users,而 MyTable 是注册在 Flink 表环境中的表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以得知问题出现在将数据库操作代码放入`addSink`方法中时会报错。因此,我们需要将数据库操作代码放入`addSink`方法中,并使用`JdbcSinkFunction`类进行入库操作。以下是连接GaussDB并使用Flink SQL CDC进行数据同步的步骤: 1.首先,需要在Flink中添加GaussDB的JDBC驱动程序。可以将驱动程序jar包放入Flink的lib目录中,或者在启动Flink Job时使用`--classpath`参数指定驱动程序jar包的路径。 2.在Flink SQL Client中创建一个表,用于存储CDC数据。例如,可以使用以下命令创建一个名为`my_table`的表: ```sql CREATE TABLE my_table ( id INT, name STRING, age INT ) WITH ( 'connector' = 'jdbc', 'url' = 'jdbc:postgresql://localhost:5432/mydb', 'table-name' = 'my_table', 'username' = 'myuser', 'password' = 'mypassword', 'sink.buffer-flush.max-rows' = '5000' ) ``` 其中,`connector`参数指定使用JDBC连接器,`url`参数指定GaussDB的连接URL,`table-name`参数指定表名,`username`和`password`参数指定连接数据库的用户名和密码,`sink.buffer-flush.max-rows`参数指定缓冲区大小。 3.在Flink SQL Client中创建一个CDC源表,用于捕获GaussDB中的变更数据。例如,可以使用以下命令创建一个名为`my_source`的CDC源表: ```sql CREATE TABLE my_source ( id INT, name STRING, age INT, ts TIMESTAMP(3), watermark FOR ts AS ts - INTERVAL '5' SECOND ) WITH ( 'connector' = 'postgresql-cdc', 'hostname' = 'localhost', 'port' = '5432', 'username' = 'myuser', 'password' = 'mypassword', 'database-name' = 'mydb', 'schema-name' = 'public', 'table-name' = 'my_table' ) ``` 其中,`connector`参数指定使用PostgreSQL CDC连接器,`hostname`和`port`参数指定GaussDB的主机名和端口号,`username`和`password`参数指定连接数据库的用户名和密码,`database-name`参数指定数据库名,`schema-name`参数指定模式名,`table-name`参数指定表名。 4.在Flink SQL Client中创建一个查询,用于将CDC源表中的数据写入目标表。例如,可以使用以下命令创建一个查询: ```sql INSERT INTO my_table SELECT id, name, age FROM my_source ``` 5.在Flink中编写一个Job,将上述查询转换为Flink Job。例如,可以使用以下代码编写一个Job: ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env); tEnv.executeSql("CREATE TABLE my_table (id INT, name STRING, age INT) WITH (...)"); tEnv.executeSql("CREATE TABLE my_source (id INT, name STRING, age INT, ts TIMESTAMP(3), watermark FOR ts AS ts - INTERVAL '5' SECOND) WITH (...)"); tEnv.executeSql("INSERT INTO my_table SELECT id, name, age FROM my_source"); env.execute(); ``` 其中,`StreamExecutionEnvironment`和`StreamTableEnvironment`分别用于创建Flink执行环境和Flink Table环境,`executeSql`方法用于执行SQL语句,`env.execute()`方法用于启动Flink Job。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值