flink cdc 实时读取MySQL全量数据,并转换为流,区分 insert|update和delete
代码
import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api._
import org.apache.flink.table.api.bridge.scala._
object Test{
def main(args: Array[String]): Unit = {
val bsEnv = StreamExecutionEnvironment.getExecutionEnvironment //创建flinkStream环境
val bsSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build()
val bnv = StreamTableEnvironment.create(bsEnv, bsSettings) //创建flinktable环境
bnv.executeSql(
"""
|CREATE TABLE mysql_binlog (
| `id` STRING,
| `comment` STRING
|) WITH (
| 'connector' = 'mysql-cdc',
| 'hostname' = '127.0.0.1',
| 'port' = '3306',
| 'username' = 'root',
| 'password' = 'root',
| 'database-name' = 'test',
| 'table-name' = 'test_table'
|)
|""".stripMargin)
// bnv.executeSql("select * from mysql_binlog").print() //原始table数据
val table: Table = bnv.from("mysql_binlog")
val tableStream: DataStream[(Boolean, (String, String))] = table.toRetractStream[(String, String)] //转换为流
val value = tableStream
.filter(_._1 == true) //得到insert和upate流
.map(_._2)
.map(data => {
data._1 + "==>" + data._2
})
val delteStream = tableStream
.filter(_._1 == false) //得到delete流
.map(data => {
data._2._1 + "==>" + data._2._2
})
value.print("insert|update")
delteStream.print("delete")
bsEnv.execute("flink table")
}
}