Flink处理数据写入mysql(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._

/*
 * 建表sql语句:
 * create database flink;
 * create table salary_table (
 * name varchar(10) ,
 * salary double
 * );
 */

/*
项目下创建datas/salary.txt文件
添加文本:
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
*/


//样例类
case class SensorReading(name: String, timestamp: Long, salary: Double)

object flinktomysql2 {

  def main(args: Array[String]): Unit = {

    val env = StreamExecutionEnvironment.getExecutionEnvironment

    env.setParallelism(1)

    //数据源
    val dataStream: DataStream[String] = env.readTextFile("datas/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://localhost:3306/flink?serverTimezone=UTC", "root", "root")
    insertStmt = conn.prepareStatement("INSERT INTO salary_table (name, salary) VALUES (?,?)")
    updateStmt = conn.prepareStatement("UPDATE salary_table SET salary = ? WHERE name = ?")

  }

  // 调用连接,执行sql
  override def invoke(value: SensorReading, context: SinkFunction.Context[_]): Unit = {

    // 执行更新语句
    updateStmt.setString(2, value.id)
    updateStmt.setDouble(1, value.temperature)
    updateStmt.execute()

    // 如果update没有查到数据,那么执行插入语句
    if( updateStmt.getUpdateCount == 0 ){
      insertStmt.setString(1, value.id)
      insertStmt.setDouble(2, value.temperature)
      insertStmt.execute()
    }
  }

  // 关闭时做清理工作
  override def close(): Unit = {
    insertStmt.close()
    updateStmt.close()
    conn.close()
  }

}
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值