赞
踩
Flink 本身是批流统一的处理框架,所以 Table API 和 SQL,就是批流统一的上层处理 API。目前功能尚未完善,处于活跃的开发阶段
。
Table API 是一套内嵌在 Java 和 Scala 语言中的查询 API,它允许我们以非常直观的方式,组合来自一些关系运算符的查询(比如 select、filter 和 join)。而对于 Flink SQL,就是直接可以在代码中写 SQL,来实现一些查询(Query)操作。Flink 的 SQL 支持,基于实现了 SQL 标准的 Apache Calcite(Apache 开源 SQL 解析工具)。
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner_2.12</artifactId>
<version>1.10.1</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-scala-bridge_2.12</artifactId>
<version>1.10.1</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-csv</artifactId>
<version>1.10.1</version>
</dependency>
flink-table-planner:planner 计划器,是 table API 最主要的部分,提供了运行时环境和生成程序执行计划的 planner;
flink-table-api-scala-bridge:bridge 桥接器,主要负责 table API 和 DataStream/DataSet API的连接支持,按照语言分 java 和 scala。
这里的两个依赖,是 IDE 环境下运行需要添加
的;如果是生产环境,lib 目录下默认已经有了 planner
,就只需要有 bridge
就可以了。
当然,如果想使用用户自定义函数,或是跟 kafka 做连接,需要有一个 SQL client,这个包含在 flink-table-common 里。
old
& blink
)的区别 TableEnvironment 可以注册目录 Catalog,并可以基于 Catalog 注册表。它会维护一个Catalog-Table 表之间的 map。
表(Table)是由一个标识符
来指定的,由 3 部分组成:Catalog 名、数据库(database)名和对象名(表名)
。如果没有指定目录或数据库,就使用当前的默认值。
连接外部系统在 Catalog 中注册表,直接调用 tableEnv.connect()
就可以,里面参数要传入一个 ConnectorDescriptor,也就是 connector 描述器。对于文件系统的 connector 而言,flink内部已经提供了,就叫做 FileSystem()。
需求: 将一个txt文本文件作为输入流读取数据过滤id不等于sensor_1的数据
实现思路: 首先我们先构建一个table的env环境通过connect提供的方法来读取数据然后设置表结构将数据注册为一张表就可进行我们的数据过滤了(使用sql或者流处理方式进行解析)
准备数据
sensor_1,1547718199,35.8
sensor_6,1547718201,15.4
sensor_7,1547718202,6.7
sensor_10,1547718205,38.1
sensor_1,1547718206,32
sensor_1,1547718208,36.2
sensor_1,1547718210,29.7
sensor_1,1547718213,30.9
代码实现
import org.apache.flink.streaming.api.scala._ import org.apache.flink.table.api.{DataTypes} import org.apache.flink.table.api.scala._ import org.apache.flink.table.descriptors.{Csv, FileSystem, Schema} /** * @Package * @author 大数据老哥 * @date 2020/12/12 21:22 * @version V1.0 * 第一个Flinksql测试案例 */ object FlinkSqlTable { def main(args: Array[String]): Unit = { // 构建运行流处理的运行环境 val env = StreamExecutionEnvironment.getExecutionEnvironment // 构建table环境 val tableEnv = StreamTableEnvironment.create(env) //通过 connect 读取数据 tableEnv.connect(new FileSystem().path("D:\\d12\\Flink\\FlinkSql\\src\\main\\resources\\sensor.txt")) .withFormat(new Csv()) //设置类型 .withSchema(new Schema() // 给数据添加元数信息 .field("id", DataTypes.STRING()) .field("time", DataTypes.BIGINT()) .field("temperature", DataTypes.DOUBLE()) ).createTemporaryTable("inputTable") // 创建一个临时表 val resTable = tableEnv.from("inputTable") .select("*").filter('id === "sensor_1") // 使用sql的方式查询数据 var resSql = tableEnv.sqlQuery("select * from inputTable where id='sensor_1'") // 将数据转为流进行输出 resTable.toAppendStream[(String, Long, Double)].print("resTable") resSql.toAppendStream[(String, Long, Double)].print("resSql") env.execute("FlinkSqlWrodCount") } }
在创建 TableEnv 的时候,可以多传入一个 EnvironmentSettings 或者 TableConfig 参数,可以用来配置 TableEnvironment 的一些特性。
val settings = EnvironmentSettings.newInstance()
.useOldPlanner() // 使用老版本 planner
.inStreamingMode() // 流处理模式
.build()
val tableEnv = StreamTableEnvironment.create(env, settings)
val batchEnv = ExecutionEnvironment.getExecutionEnvironment
val batchTableEnv = BatchTableEnvironment.create(batchEnv)
val bsSettings = EnvironmentSettings.newInstance()
.useBlinkPlanner()
.inStreamingMode().build()
val bsTableEnv = StreamTableEnvironment.create(env, bsSettings)
val bbSettings = EnvironmentSettings.newInstance()
.useBlinkPlanner()
.inBatchMode().build()
val bbTableEnv = TableEnvironment.create(bbSettings)
本篇文章主要讲解了Flink SQL 入门操作,后面我会分享一些关于Flink SQL连接Kafka、输出到kafka、MySQL等。我们下期见~~~
微信公众号搜索【大数据老哥】可以获取 200个为你定制的简历模板、大数据面试题、企业面试
题…等等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。