Flink实现数据写入MySQL

 先准备一个文件里面数据有:

a, 1547718199, 1000000
b, 1547718200, 1000000
c, 1547718201, 1000000
d, 1547718202, 1000000
e, 1547718203, 1000000
f, 1547718204, 1000000
g, 1547718205, 1000000
h, 1547718210, 1000000
i, 1547718210, 1000000
j, 1547718210, 1000000

 scala代码:

import java.sql.{Connection, DriverManager, PreparedStatement}
import org.apache.flink.configuration.Configuration
import org.apache.flink.streaming.api.functions.sink.{RichSinkFunction, SinkFunction}
import org.apache.flink.streaming.api.scala._

  case class SensorReading(name: String, timestamp: Long, salary: Double)
  object a1 {
    def main(args: Array[String]): Unit = {
      val env = StreamExecutionEnvironment.getExecutionEnvironment
      env.setParallelism(1)
      //数据源
      val dataStream: DataStream[String] = env.readTextFile("D:\\wlf.备份24.1.3\\wlf\\ideaProgram\\bbbbbb\\src\\main\\resources\\salary.txt")
      val stream = dataStream.map(data => {
        val splited = data.split(",")
        SensorReading(splited(0), splited(1).trim.toLong, splited(2).trim.toDouble)
      })
      stream.addSink( new JDBCSink() )
      env.execute("  job")
    }
  }


  class JDBCSink() extends RichSinkFunction[SensorReading]{
    // 定义sql连接、预编译器
    var conn: Connection = _
    var insertStmt: PreparedStatement = _
    var updateStmt: PreparedStatement = _
    // 初始化,创建连接和预编译语句
    override def open(parameters: Configuration): Unit = {
      super.open(parameters)
      conn = DriverManager.getConnection("jdbc:mysql://bigdata1:3306/flink?serverTimezone=UTC", "root", "123456")
      insertStmt = conn.prepareStatement("INSERT INTO salary_table (name, salary) VALUES (?,?)")
      updateStmt = conn.prepareStatement("UPDATE salary_table SET salary = ? WHERE name = ?")
    }
    override def invoke(value: SensorReading): Unit = {
      // 执行更新语句
      updateStmt.setString(1, value.name)
      updateStmt.setDouble(2, value.salary)
      updateStmt.execute()
      // 如果update没有查到数据,那么执行插入语句
      if( updateStmt.getUpdateCount == 0 ){
        insertStmt.setString(1, value.name)
        insertStmt.setDouble(2, value.salary)
        insertStmt.execute()
      }
    }
    // 关闭时做清理工作
    override def close(): Unit = {
      insertStmt.close()
      updateStmt.close()
      conn.close()
    }
}

MySQL中查看表 :

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Flink 中将数据写入MySQL 中,可以通过以下步骤实现: 1. 引入 MySQL 驱动依赖 在 pom.xml 文件中加入以下依赖: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> ``` 2. 实现自定义的 SinkFunction 可以通过实现 SinkFunction 接口来自定义数据写入的逻辑。以下是一个简单的实现示例: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.List; import org.apache.flink.streaming.api.functions.sink.SinkFunction; public class MySQLSink implements SinkFunction<List<String>> { private final String url; private final String username; private final String password; private final String sql; public MySQLSink(String url, String username, String password, String sql) { this.url = url; this.username = username; this.password = password; this.sql = sql; } @Override public void invoke(List<String> values) throws Exception { Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement ps = conn.prepareStatement(sql); for (String value : values) { ps.setString(1, value); ps.addBatch(); } ps.executeBatch(); ps.close(); conn.close(); } } ``` 上述代码中的 `invoke()` 方法被 Flink 调用,将数据写入MySQL 中。`url`、`username`、`password` 和 `sql` 分别是连接 MySQL 数据库的 URL、用户名、密码和执行的 SQL 语句。 3. 将数据写入到自定义 SinkFunction 中 在 Flink 的 DataStream 中,可以使用 `addSink()` 方法将数据写入到自定义的 SinkFunction 中。以下是一个示例: ```java DataStream<String> stream = ...; stream.addSink(new MySQLSink("jdbc:mysql://localhost:3306/test", "root", "123456", "INSERT INTO table_name (column_name) VALUES (?)")); ``` 上述代码中的 `stream` 是一个数据流,通过 `addSink()` 方法将数据写入MySQL 中。`MySQLSink` 是自定义的 SinkFunction,用于将数据写入MySQL 数据库中。在 `MySQLSink` 的构造函数中,需要传入连接 MySQL 数据库的 URL、用户名、密码和执行的 SQL 语句。`values` 参数是一个 `List`,包含了要写入MySQL 中的数据。在 `invoke()` 方法中,首先连接 MySQL 数据库,然后通过 `PreparedStatement` 执行 SQL 语句,将数据写入MySQL 中。 注意:在实际使用中,为了提高性能,可以使用连接池管理连接,避免频繁创建和关闭连接。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值