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)