Flink批处理之JDBC读写Mysql--Scala

1、环境

   jdk 1.8.0_108

   Scala 2.11.8

   Flink 1.7.2

  MySql 8.0.13

2、Maven依赖


     org.apache.flink
     flink-scala_2.11
     1.7.2
    


     org.apache.flink
     flink-jdbc_2.12
     1.7.2



    mysql
    mysql-connector-java
    5.1.46

3、读取和写入代码

 

package com.zander.flink


import org.apache.flink.api.common.typeinfo.BasicTypeInfo
import org.apache.flink.api.java.io.jdbc.{JDBCInputFormat, JDBCOutputFormat}
import org.apache.flink.api.java.typeutils.RowTypeInfo
import org.apache.flink.api.scala.{ExecutionEnvironment, _}
import org.apache.flink.types.Row

import scala.collection.mutable.ArrayBuffer

/**
  * Created By User: zander
  * Created On Date: 2019/11/20 0020 11:01
  */
object FlinkReadMySqlTest {
  private val JDBC_URL: String = "jdbc:mysql://192.168.0.106:3306/test"
  private val JDBC_USER: String = "root"
  private val JDBC_PASSWORD: String = "root"
  private val JDBC_DRIVER_CLASS: String = "com.mysql.jdbc.Driver"

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

    val env = ExecutionEnvironment.getExecutionEnvironment

    val inputMysql = testJDBCRead(env)
    //  inputMysql.print()
    inputMysql.map(s => (s.getField(0),s.getField(1),s.getField(2))).print()

    testJDBCWrite(env)


  }


  def testJDBCRead(env: ExecutionEnvironment): DataSet[Row] = {
    val inputMysql = env.createInput(JDBCInputFormat.buildJDBCInputFormat()
      // 数据库连接驱动名称
      .setDrivername(JDBC_DRIVER_CLASS)
      // 数据库连接驱动名称
      .setDBUrl(JDBC_URL)
      // 数据库连接用户名
      .setUsername(JDBC_USER)
      // 数据库连接密码
      .setPassword(JDBC_PASSWORD)
      // 数据库连接查询SQL
      .setQuery("select name,age,class from test")
      // 字段类型,顺序个个数必须与SQL保持一致
      .setRowTypeInfo(new RowTypeInfo(BasicTypeInfo.STRING_TYPE_INFO, BasicTypeInfo.INT_TYPE_INFO, BasicTypeInfo.STRING_TYPE_INFO))
      .finish()
    )
    inputMysql
  }

  def testJDBCWrite(env: ExecutionEnvironment): Unit = {
    // 生成测试数据,由于插入数据需要是Row格式,提前设置为Row
    val arr = new ArrayBuffer[Row]()
    val row1 = new Row(3)
    row1.setField(0, "张飞")
    row1.setField(1, 50)
    row1.setField(2, "蜀")

    val row2 = new Row(3)
    row2.setField(0, "曹操")
    row2.setField(1, 48)
    row2.setField(2, "魏")

    val row3 = new Row(3)
    row3.setField(0, "孙权")
    row3.setField(1, 36)
    row3.setField(2, "吴")

    arr.+=(row1)
    arr.+=(row2)
    arr.+=(row3)

    // 将集合数据转成DataSet
    val data = env.fromCollection(arr)
    // 使用JDBCOutputFormat,将数据写入到Mysql
    data.output(JDBCOutputFormat.buildJDBCOutputFormat()
      // 数据库连接驱动名称
      .setDrivername(JDBC_DRIVER_CLASS)
      // 数据库连接驱动名称
      .setDBUrl(JDBC_URL)
      // 数据库连接用户名
      .setUsername(JDBC_USER)
      // 数据库连接密码
      .setPassword(JDBC_PASSWORD)
      // 数据库插入SQL
      .setQuery("insert into test (name,age,class) values(?,?,?)")
      .finish())

    // 触发执行
    env.execute("Test JDBC  Output")
  }


}

 

    以上主要是使用了Flink的批处理模式下通过JDBC读取Mysql,其他数据库类似

    

你可能感兴趣的:(Flink,大数据)