- flink1.11实现union三条流合并
- 两条Kafka流和mysql cdc流进行合并
- 可用于实时维表建模
package com.transform
import java.util.Properties
import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer
import org.apache.flink.table.api._
import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment
import org.apache.flink.types.Row
object Union {
case class User(id: String, name: String, sex:String, age:Int, ts:Long)
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
val bsSettings = EnvironmentSettings.newInstance.useBlinkPlanner.inStreamingMode.build
val sTableEnv = StreamTableEnvironment.create(env, bsSettings)
val properties = new Properties()
properties.setProperty("bootstrap.servers", "jeff200:9092")
val test1Consumer = new FlinkKafkaConsumer[String](
"test1",
new SimpleStringSchema(),
properties
)
val test2Consumer = new FlinkKafkaConsumer[String](
"test2",
new SimpleStringSchema(),
properties
)
test1Consumer.setStartFromEarliest()
test2Consumer.setStartFromEarliest()
val test1DataStream = env.addSource(test1Consumer)
val testDataStream = env.addSource(test2Consumer)
.union(test1DataStream)
.map(data=>{
val arr = data.split(",")
User(arr(0), arr(1), arr(2), arr(3).toInt, arr(4).toLong)
})
val userDDL =
s"""
|CREATE TABLE t_user (
| uid int,
| name string
|) WITH (
| 'connector' = 'mysql-cdc',
| 'hostname' = 'jeff200',
| 'port' = '3306',
| 'username' = 'root',
| 'password' = 'root',
| 'database-name' = 'test_db',
| 'table-name' = 't_user'
|)
|""".stripMargin
sTableEnv.executeSql(userDDL)
val filterSql =
s"""
|SELECT uid, name
|FROM t_user
|WHERE uid > 0
""".stripMargin
val table: Table = sTableEnv.sqlQuery(filterSql)
val tableDataStream:DataStream[(Boolean, Row)] = sTableEnv.toRetractStream(table)
val userDataStream = tableDataStream
.map(data=>{
User(
id = data._2.getField(0).toString,
name = data._2.getField(1).toString,
sex = "数据库",
age = 100,
ts = 0
)
})
val unionDataStream = testDataStream
.union(userDataStream)
unionDataStream.print()
env.execute("Union Job")
}
}
1,男,张三,20,1605970941
2,女,莉莉,30,1605970922
3,女,红红,30,1605970913
4,男,李四,24,1605970904
5,男,王五,25,1605970965
6,男,小明,20,1605970946
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-scala-bridge_2.11</artifactId>
<version>${flink.version}</version>
<scope>${scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner-blink_2.11</artifactId>
<version>${flink.version}</version>
<scope>${scope}</scope>
</dependency>
<dependency>
<groupId>com.alibaba.ververica</groupId>
<artifactId>flink-connector-mysql-cdc</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_2.11</artifactId>
<version>${flink.version}</version>
<scope>${scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>${kafka.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-json</artifactId>
<version>${flink.version}</version>
<scope>${scope}</scope>
</dependency>
- 运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201219104354741.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9jMTAwMjAw,size_16,color_FFFFFF,t_70#pic_center)