Flink定义表结构

使用FlinkSQL读取kafka里面数据不涉及到source和sink概念的.

import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.scala._
import org.apache.flink.table.api.{DataTypes, Table}
import org.apache.flink.table.descriptors._

/**
* 读取kafka的数据并且转成表
*/
object TableApiTest3 {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1)
val tableEnv = StreamTableEnvironment.create(env)


// 连接到Kafka
tableEnv.connect(new Kafka()
//先去定义一个kafkaClient的版本,必须要定义的.因为Kafka的不同的版本和连接器的版本还不一样.
.version("0.11")
.topic("sensor")
// kafka地址
.property("bootstrap.servers", "zjj101:9092")
//zookeeper地址
.property("zookeeper.connect", "zjj101:2181,zjj102:2181,zjj103:2181")
)
.withFormat(new Csv()) // 指定csv格式,就是逗号分割的格式,因为kafka输入的数据就是这个格式的.
//创建每个字段的名字和类型
.withSchema(new Schema()
.field("id", DataTypes.STRING())
.field("timestamp", DataTypes.BIGINT())
.field("temperature", DataTypes.DOUBLE())
)
// 创建表名
.createTemporaryTable("kafkaInputTable")


val table: Table = tableEnv.from("kafkaInputTable")

table.toAppendStream[(String, Long, Double)].print()

env.execute("table api test job")
}
}

启动kafka生产者

先启动Flink程序,然后启动Kafka生产者,往里面输入内容

[root@zjj101 ~]# $KAFKA_HOME/bin/kafka-console-producer.sh --broker-list zjj101:9092  --topic sensor
>sensor_1,1547718199,35.8
>sensor_7,1547718202,6.7
>sensor_1,1547718215,38.1

输出结果

(sensor_1,1547718199,35.8)
(sensor_7,1547718202,6.7)
(sensor_1,1547718215,38.1)