Flink1.14.3 Table读写MySQL做数据聚合(1)

摘要

  1. 使用JDBC SQL Connector,Source只支持批处理,Sink支持批处理和流处理。
  2. Sink支持数据追加和更新,如果Flink Table API做聚合操作,使用Sink必须指定指定主键。
  3. 本案例独家使用Flink Table API(非SQL)方式读写MySQL,官网只讲解了SQL的使用方式。

1 需求

需求:Flink Table API从MySQL读取数据,然后做聚合操作,最后将聚合结果写入MySQL。

2 添加Maven依赖

FlinkTable集成MySQL需引⼊如下依赖:

<dependency>

  <groupId>org.apache.flink</groupId>

  <artifactId>flink-connector-jdbc_2.11</artifactId>

  <version>${flink.version}</version>

</dependency>

<dependency>

  <groupId>mysql</groupId>

  <artifactId>mysql-connector-java</artifactId>

  <version>5.1.38</version>

</dependency>

3 准备MySQL数据源

在MySQL的test数据库中,创建clicklog表并导入初始数据集。

DROP TABLE IF EXISTS `clicklog`;

CREATE TABLE `clicklog` (

  `user` varchar(20) NOT NULL,

  `url` varchar(100) NOT NULL,

  `cTime` varchar(30) NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert  into `clicklog`(`user`,`url`,`cTime`) values ('Mary','./home','2022-02-02 12:00:00'),('Bob','./cart','2022-02-02 12:00:00'),('Mary','./prod?id=1','2022-02-02 12:00:05');

4 代码实现

Flink Table API读写MySQL的完整代码如下所示。

package com.bigdata.chap02;

import org.apache.flink.table.api.*;

import static org.apache.flink.table.api.Expressions.$;

public class FlinkTableAPIMySQL2MySQL {

public static void main(String[] args) {

//1、创建TableEnvironment

EnvironmentSettings settings = EnvironmentSettings

.newInstance()

.build();

TableEnvironment tEnv = TableEnvironment.create(settings);

//2、创建Mysql source table

Schema sourceschema = Schema.newBuilder()

//.primaryKey("user")

.column("user", DataTypes.STRING())

.column("url", DataTypes.STRING())

.column("cTime", DataTypes.STRING())

.build();

tEnv.createTemporaryTable("sourceTable", TableDescriptor.forConnector("jdbc")

.schema(sourceschema)

.option("url","jdbc:mysql://hadoop1:3306/test")

.option("driver","com.mysql.jdbc.Driver")

.option("table-name","clicklog")

.option("username","hive")

.option("password","hive")

.build());

tEnv.from("sourceTable").printSchema();

//3、创建MySQL sink table

Schema sinkschema = Schema.newBuilder()

//通过notNull()指定主键为非空

.column("username",DataTypes.STRING().notNull())

.column("count", DataTypes.BIGINT())

//指定主键

.primaryKey("username")

.build();

tEnv.createTemporaryTable("sinkTable", TableDescriptor.forConnector("jdbc")

.schema(sinkschema)

.option("url","jdbc:mysql://hadoop1:3306/test")

.option("driver","com.mysql.jdbc.Driver")

.option("table-name","clickcount")

.option("username","hive")

.option("password","hive")

.build());

//5、输出

Table reusltTable = tEnv.from("sourceTable")

.groupBy($("user"))

.aggregate($("url").count().as("count"))

.select($("user").as("username"), $("count"))

;

reusltTable.printSchema();

reusltTable.executeInsert("sinkTable");

}

}

备注:Flink Table API做聚合操作插入MySQL,必须指定主键(.primaryKey("username")),同时必须指定主键为非空(.column("username",DataTypes.STRING().notNull()))

5 MySQL业务建表

在MySQL的test数据库中,创建clickcount表用于Flink Table的聚合数据。

DROP TABLE IF EXISTS `clickcount`;

CREATE TABLE `clickcount` (

  `username` varchar(20) NOT NULL DEFAULT '',

  `count` int(11) DEFAULT NULL,

  PRIMARY KEY (`username`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

注意:如果clickcount表需要做更新操作,需要指定主键(primary key),如username。

6 测试运行

打开MySQL连接工具,查询clickcount表中的数据,如果聚合数据能插入clickcount表,说明Flink Table API能成功将聚合数据写入MySQL数据库。

7 注意事项

注意:

  1. 使用JDBC SQL connector过程中,作为source只支持批处理,作为sink既可以用于批处理又可以用于流处理。
  2. Sink支持数据的追加和更新,如果Flink Table API做聚合操作,使用sink更新聚合数据,必须指定指定主键。
  3. 本案例独家使用Flink Table API(非SQL)方式读写MySQL,官网只讲解了SQL的使用方式。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个基于Flink1.14.3 Table SQL API的MySQL列加工数据处理JAVA代码的示例: ```java import org.apache.flink.api.common.typeinfo.TypeInformation; import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.java.typeutils.RowTypeInfo; import org.apache.flink.connector.jdbc.JdbcInputFormat; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.EnvironmentSettings; import org.apache.flink.table.api.Table; import org.apache.flink.table.api.TableEnvironment; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; import org.apache.flink.types.Row; public class MySQLColumnProcessing { public static void main(String[] args) throws Exception { // 创建执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build()); // 定义MySQL连接信息 String url = "jdbc:mysql://localhost:3306/test"; String username = "root"; String password = "root"; String driverName = "com.mysql.jdbc.Driver"; // 定义MySQL输入格式 JdbcInputFormat jdbcInputFormat = JdbcInputFormat.buildJdbcInputFormat() .setDrivername(driverName) .setDBUrl(url) .setUsername(username) .setPassword(password) .setQuery("SELECT * FROM user") .setRowTypeInfo(new RowTypeInfo(TypeInformation.of(Integer.class), TypeInformation.of(String.class), TypeInformation.of(Integer.class))) .finish(); // 创建一个表,并将MySQL数据源注册为表 Table table = tEnv.fromDataStream(env.createInput(jdbcInputFormat), "id, name, age"); tEnv.registerTable("user", table); // 使用SQL API进行列加工处理 Table result = tEnv.sqlQuery("SELECT id, CONCAT('My name is ', name) as name, age+1 as age FROM user"); // 打印结果 tEnv.toRetractStream(result, Row.class).print(); // 执行任务 env.execute("MySQL Column Processing"); } } ``` 这个示例代码读取MySQL数据库中的`user`表数据,对`name`列进行字符串拼接,并对`age`列进行加1操作,最后将结果打印出来。您需要将MySQL连接信息替换为自己的连接信息,并根据具体的业务需求修改SQL查询语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据研习社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值