目录
13.1 定义处理时间(processing time )
1 Table API 和Flink SQL 是什么
Flink 对流处理和批处理,提供了统一的上层API
Table API 是一套内嵌在Java 和Scala 语言中的查询API,它允许以非常直观的方式组合来自一些关系院选符的查询
Flink 的SQL支持基于实现了SQL标准的Apache calcite
2 简单使用table api 和 flink SQL
2.1 引入依赖
① flink-table-common
通过自定义函数,格式等扩展表生态系统的通用模块。
② flink-table-api-java-bridge
使用Java编程语言支持DataStream / DataSet API的Table&SQL API。
③ flink-table-api-scala-bridge
使用Scala编程语言支持DataStream / DataSet API的Table&SQL API。
④ flink-table-planner
表程序规划器和运行时。
link-table-planner引入后会自动引入上面①~④四个jar 包
老版本planner
<!-- flink-table-planner -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner_2.12</artifactId>
<version>1.10.1</version>
</dependency>
flink-table-planner-blink
新版本planner
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner-blink_2.12</artifactId>
<version>1.10.1</version>
</dependency>
2.2 代码demo
package com.study.liucf.table
import com.study.liucf.bean.LiucfSensorReding
import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.Table
import org.apache.flink.table.api.scala._
object LiucfTableAPIDemo1 {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
val inputStream: DataStream[String] = env.readTextFile("src\\main\\resources\\sensor.txt")
val ds: DataStream[LiucfSensorReding] = inputStream.map(r=>{
val arr = r.split(",")
LiucfSensorReding(arr(0),arr(1).toLong,arr(2).toDouble)
})
//定义表环境
val tableEnv = StreamTableEnvironment.create(env)
//基于流创建一张表
val flinkTable: Table = tableEnv.fromDataStream(ds)
//第一种方式:调用table api 进行转换
val resultFlinkTable1 = flinkTable
.select("id,temperature")
.filter("id == 'sensor_1'")
resultFlinkTable1.printSchema()
//基于表创建流
val resStream1 = tableEnv.toAppendStream[(String,Double)](resultFlinkTable1)
//输出结果
resStream1.print("Table API")
//第二种方式:把 Flink Table 注册成一张表然后进行转换
tableEnv.createTemporaryView("flinkTableLiucf", flinkTable)
//转换sql
val flinkSQLStr = "select id,temperature from flinkTableLiucf where id = 'sensor_1'"
//执行转换
val resultFlinkTable2: Table = tableEnv.sqlQuery(flinkSQLStr)
resultFlinkTable2.printSchema()
//基于表创建流
val resStream2 = tableEnv.toAppendStream[(String,Double)](resultFlinkTable2)
//输出结果
resStream2.print("Flink SQL")
env.execute("table api test")
}
}
3 基本程序结构
4 创建TableEnvironment
创建表的执行环境,需要将flink流处理的执行环境传入
val tableEnv = StreamTaleEnvironment.create(env)
TableEnvironment 是flink 中集成Table API 和 SQL 的核心概念,所有对表的基本操作都基于TableEnvironment
- 注册 Catalog
Catalog描述了数据集的属性和数据集的位置,这样用户不需要指出数据集的位置就可以获得某个数据集。
- 在Catalog中注册表
- 执行SQL查询
- 注册用户自定义函数(UDF)
5 table
5.1 table 是什么
5.2 创建表
5.3 代码演示
package com.study.liucf.table
import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.{DataTypes, Table}
import org.apache.flink.table.api.scala.StreamTableEnvironment
import org.apache.flink.table.descriptors.{FileSystem, OldCsv, Schema}
import org.apache.flink.table.types.{DataType, FieldsDataType}
object LiucfTableAPIConnectFile {
def main(args: Array[String]): Unit = {
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
val tableEnv = StreamTableEnvironment.create(env)
val path = "src/main/resources/sensor.csv"
tableEnv
.connect(new FileSystem().path(path))//定义表的数据来源,和外部系统建立连接
.withFormat(new OldCsv())//定义数据格式化方式
.withSchema(new Schema() //定义表的结构
.field("id",DataTypes.STRING())
.field("timestamp",DataTypes.BIGINT())
.field("temperature",DataTypes.DOUBLE())
).createTemporaryTable("file_table_test")//创建临时表
//把临时表转换成 Table
val table: Table = tableEnv.from("file_table_test")
table.printSchema()
//把TAble转换成数据流
val value = tableEnv.toAppendStream[(String,Long,Double)](table)
value.print("Table API Connect File")
env.execute("Table API")
}
}
6 表的查询
6.1 表的查询 Table API
6.2 表的查询 Flink SQL
6.3 代码示例
查询转换参考2.2
package com.study.liucf.table
import com.study.liucf.bean.LiucfSensorReding
import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.Table
import org.apache.flink.table.api.scala._
object LiucfTableAPIDemo1 {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
val inputStream: DataStream[String] = env.readTextFile("src\\main\\resources\\sensor.txt")
val ds: DataStream[LiucfSensorReding] = inputStream.map(r=>{
val arr = r.split(",")
LiucfSensorReding(arr(0),arr(1).toLong,arr(2).toDouble)
})
//定义表环境
val tableEnv = StreamTableEnvironment.create(env)
//基于流创建一张表
val flinkTable: Table = tableEnv.fromDataStream(ds)
//第一种方式:调用table api 进行转换
val