Table API 以及 SQL 能够统一处理批量和实时计算业务, 无须切换修改任何应用代码就能够基于同一套 API 编写流式应用和批量应用, 从而达到真正意义的批流统一


一. 开发环境构建
-
在使用 Table API 和 SQL 开发 Flink 应用之前, 通过添加 Maven 的依赖配置到项目中, 在本地工程中引入相应的依赖库, 库中包含了 TableAPI 和 SQL 接口。
<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-planner_2.11</artifactId> <version>1.9.1</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-api-scala-bridge_2.11</artifactId> <version>1.9.1</version> </dependency>
二. TableEnvironment
-
和 DataStream API 一样,Table API 和 SQL 中具有相同的基本编程模型。首先需要构 建对应的 TableEnviroment 创建关系型编程环境, 才能够在程序中使用 Table API 和 SQL 来编写应用程序, 另外 Table API 和 SQL 接口可以在应用中同时使用, Flink SQL 基于 Apache Calcite 框架实现了 SQL 标准协议, 是构建在 Table API 之上的更高级接口。
-
首先需要在环境中创建 TableEnvironment 对象, TableEnvironment 中提供了注册内部表、执行 Flink SQL 语句、注册自定义函数等功能。根据应用类型的不同,TableEnvironment创建方式也有所不同,但是都是通过调用 create()方法创建。
-
流计算环境下创建 TableEnviroment:
val streamEnv: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment val tableEnv1: StreamTableEnvironment = StreamTableEnvironment.create(streamEnv) val settings: EnvironmentSettings = EnvironmentSettings.newInstance().useOldPlanner().inStreamingMode().build() val tableEnv2: StreamTableEnvironment = StreamTableEnvironment.create(streamEnv, settings)
三. Table API
1. 创建Table
1 Table API 中已经提供了 TableSource 从外部系统获取数据,例如常见的数据库、文件 系统和 Kafka 消息队列等外部系统。
2 在 Flink 中创建一张表有两种方法:
- 从一个文件中导入表结构(Structure) (常用于批计算)(静态)
- 从 DataStream 或者 DataSet 转换成 Table (动态)
-
从文件中创建Table(静态表)
Flink 允许用户从本地或者分布式文件系统中读取和写入数据,在 Table API 中可以通 过 CsvTableSource 类来创建,只需指定相应的参数即可。但是文件格式必须是 CSV 格式的。 其他文件格式也支持(在 Flink 还有 Connector 的来支持其他格式或者定义TableSource)package com.hjf.table import org.apache.flink.api.scala.typeutils.Types import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment import org.apache.flink.table.api.EnvironmentSettings import org.apache.flink.table.api.scala.StreamTableEnvironment import org.apache.flink.table.sources.CsvTableSource object TestTableEnvironment { def main(args: Array[String]): Unit = { // 创建环境方法1 val streamEnv: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment val tableEnv1: StreamTableEnvironment = StreamTableEnvironment.create(streamEnv) // 创建环境方法2 val settings: EnvironmentSettings = EnvironmentSettings.newInstance().useOldPlanner().inStreamingMode().build() val tableEnv2: StreamTableEnvironment = StreamTableEnvironment.create(streamEnv, settings) // 创建CSV格式的TableSource val fileSource: CsvTableSource = new CsvTableSource("/station.log", Array[String]("sid", "call_out", "call_in", "call_type", "call_time", "duration"), Array(Types.STRING, Types.STRING, Types.STRING, Types.STRING, Types.LONG, Types.LONG) ) // 注册Table, 表名为t_log tableEnv1.registerTableSource("t_log", fileSource) // 转换成Table对象, 并打印表结构 tableEnv1.scan("t_log").printSchema() } }
-
从 DataStream 中创建 Table(动态表)
package com.hjf.table import com.hjf.dataSource.StationLog import org.apache.flink.streaming.api.scala.{ DataStream, StreamExecutionEnvironment} import org.apache.flink.table.api.Table import org.apache.flink.table.api.scala.StreamTableEnvironment object TestCreateTableForStream { def main(args: Array[String]): Unit = { // 创建环境方法1 val streamEnv: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment val tableEnv: StreamTableEnvironment = StreamTableEnvironment.create(streamEnv) import org.apache.flink.streaming.api.scala._ //val stream: DataStream[StationLog] = streamEnv.socketTextStream("node01", 8888) val stream = streamEnv.readTextFile(getClass.getResource("/station.log").getPath) .map(one => { val arr: Array[String] = one.split(",") new StationLog(arr(0).trim, arr(1).trim, arr(2).trim, arr(3).trim, arr(4).trim<

最低0.47元/天 解锁文章
697

被折叠的 条评论
为什么被折叠?



