0.前言
FlinkSql的使用与流式计算结构是一样的,source、transform、sink,因此首先研究source。
1创建表环境
//创建流式计算的执行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
//表环境基于流式计算的环境create
val tableEnv : StreamTableEnvironment = StreamTableEnvironment.create(env)
2source(fromDataStream)
//读取数据
val data = env.readTextFile()
//转换数据格式
val dataStream = data.map(
line => {
...
}
)
val tableEnv : StreamTableEnvironment = StreamTableEnvironment.create(env)
//第一种读取数据方式,直接读取DataStream返回Table
val tableData: Table = tableEnv.fromDataStream(dataStream)
val table: Table = tableData.select(...)
.filter(...)
val ds: DataStream[(String, Double)] = table.toAppendStream[(String,Double)]
ds.print()
3source(kafka)
// 1. 创建表执行环境
val tableEnv = StreamTableEnvironment.create(env)
// 2 定义到kafka的连接,创建输入表
tableEnv.connect(new Kafka()
.version("0.11") // 定义版本
.topic("sensor") // 定义主题
.property("zookeeper.connect", "hdp-1:2181")
.property("bootstrap.servers", "hdp-1:9092")
)
.withFormat(new Csv())
.withSchema(new Schema()
.field("id", DataTypes.STRING())
.field("timestamp", DataTypes.BIGINT())
.field("temperature", DataTypes.DOUBLE())
.field("pt", DataTypes.TIMESTAMP(3))
.proctime()
)
.createTemporaryTable("kafkaInputTable")
4source(FileSystem)
// 2. 连接外部系统,读取数据
val filePath = "..."
tableEnv.connect(new FileSystem().path(filePath))
.withFormat(new OldCsv()) // 定义从外部文件读取数据之后的格式化方法
.withSchema(new Schema()
.field("id", DataTypes.STRING())
.field("timestamp", DataTypes.BIGINT())
.field("temperature", DataTypes.DOUBLE())
) // 定义表的结构
.createTemporaryTable("inputTable") // 在表环境注册一张表