GitHub
https://github.com/SmallScorpion/flink-tutorial.git
Table API 和 Flink SQL 是什么
- Flink 对批处理和流处理,提供了统一的上层 API
- Table API 是一套内嵌在 Java 和 Scala 语言中的查询API,它允许以非常直观的方式组合来自一些关系运算符的查询
- Flink 的 SQL 支持基于实现了 SQL 标准的 Apache Calcite
基本程序结构
Table API 和 SQL 的程序结构,与流式处理的程序结构十分类似
POM
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner_2.11</artifactId>
<version>1.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner-blink_2.11</artifactId>
<version>1.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-csv</artifactId>
<version>1.10.0</version>
</dependency>
简单实例
import com.atguigu.bean.SensorReading
// 隐式转换
import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.Table
// 隐式转换
import org.apache.flink.table.api.scala._
object Example {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1)
val inputDStream: DataStream[String] = env.readTextFile("D:\\MyWork\\WorkSpaceIDEA\\flink-tutorial\\src\\main\\resources\\SensorReading.txt")
val dataDstream: DataStream[SensorReading] = inputDStream.map(
data => {
val dataArray: Array[String] = data.split(",")
SensorReading(dataArray(0), dataArray(1).toLong, dataArray(2).toDouble)
})
// 1. 基于env创建表环境
val tableEnv: StreamTableEnvironment = StreamTableEnvironment.create(env)
// 2. 基于tableEnv 将流转换成表
val dataTable: Table = tableEnv.fromDataStream(dataDstream)
// 3. 只输出id为sensor_1的id和温度值
// 3.1 调用table api,做转换操作
val resultTable: Table = dataTable
.select("id, temperature")
.filter("id == 'sensor_1'")
// 3.2 直接调用SQL - 写sql实现转换
tableEnv.registerTable("dataTable", dataTable) // 注册表
val resultSqlTable: Table = tableEnv.sqlQuery(
"""
|select
| id, temperature
|from
| dataTable
|where
| id = 'sensor_1'
|""".stripMargin
)
// 4. 将表转换成流操作
resultTable.toAppendStream[ (String, Double) ].print(