场景:从MySQL数据库中读取数据进过Flink清洗再存入到MySQL中
一、直接上代码,代码中的数据库连接参数、实体类可改成自己的
@PostMapping("dataStreamAPI")
public void dataStreamAPI() throws Exception {
//创建执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//设置并行度
env.setParallelism(1);
//获取数据源
DataStream<Event> stream = env.addSource(new RichSourceFunction<Event>() {
private volatile boolean isRunning = true;
private Connection conn = null;
private PreparedStatement ps = null;
// 打开数据库连接,只执行一次,之后一直使用这个连接
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
Class.forName("com.mysql.jdbc.Driver"); // 加载数据库驱动
conn = (Connection) DriverManager.getConnection( // 获取连接
"jdbc:mysql://xxx.xxx.xxx.xxx:3306/talbe?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true", // 数据库URL
"root", // 用户名
"root"); // 登录密码
ps = (PreparedStatement) conn.prepareStatement( // 获取执行语句
"SELECT stkcd,easy_name,publisher FROM bond_base_all LIMIT 0,10"); // 需要执行的SQL语句
}
// 执行查询并获取结果
@Override
public void run(SourceContext<Event> ctx) throws Exception {
// while(isRunning) { // 使用while循环可以不断读取数据
ResultSet resultSet = ps.executeQuery();
while (resultSet.next()) {
String value1 = resultSet.getString("stkcd");
String value2 = resultSet.getString("easy_name");
String value3 = resultSet.getString("publisher");
ctx.collect(new Event(value1, value2, value3)); // 以流的形式发送结果
}
// Thread.sleep(6000); // 每隔6秒查询一次
// }
}
// 取消数据生成
@Override
public void cancel() {
isRunning = false;
}
// 关闭数据库连接
@Override
public void close() throws Exception {
super.close();
if (conn != null) conn.close();
if (ps != null) ps.close();
}
})
//中间可以进行一些数据转换操作
.map(new MapFunction<Event, Event>() {
@Override
public Event map(Event event) throws Exception {
return new Event(event.getValue1().split("\\.")[0], "债券简称:" + event.getValue2(), event.getValue3());
}
});
//把数据存入到mysql中
stream.addSink(JdbcSink.sink(
"INSERT INTO t_event VALUES (?,?,?)",//SQL语句 插值表达式
(((statement, event) -> {//(进行数据插入,数据源的数据)
statement.setString(1, event.value1);
statement.setString(2, event.value2);
statement.setString(3, event.value3);
})),
new JdbcConnectionOptions.JdbcConnectionOptionsBuilder()
.withUrl("jdbc:mysql://xxx.xxx.xxx.xxx:3306/table?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true")//URL连接地址
.withDriverName("com.mysql.jdbc.Driver")//JDBC驱动
.withUsername("root")//用户名
.withPassword("root")//密码
.build()
));
//启动
env.execute();
}
二、访问该接口进行任务执行
数据源表数据:
数据入库表数据:
总结:经过Flink简单的清洗已实现库到库的数据传输