文章目录
Flink中Table API & SQL简单介绍
对于像DataFrame这样的关系型编程接口,因其强大且灵活的表达能力,能够让用户通过非常丰富的接口对数据进行处理,有效降低了用户的使用成本,近年来逐渐成为主流大数据处理框架主要接口形式之一。Flink也提供了关系型编程接口Table API以及基于TableAPI的SQL API,让用户能够通过使用结构化编程接口高效的构建Flink应用。同时Table API以及SQL能够统一处理批量和实时计算业务,无需切换到修改任何应用代码就能够基于同一套API编写流式应用和批量应用,从而达到真正意义的批流统一。
Apache Flink具有两个关系API - 表API和SQL- 用于统一流和批处理。Table API是Scala和Java的语言集成查询API,允许以非常直观的方式组合来自关系运算符的查询,Table API和SQL接口彼此紧密集成,以及Flink的DataStream和DataSet API。您可以轻松地在基于API构建的所有API和库之间切换。例如,您可以使用CEP库从DataStream中提取模式,然后使用Table API分析模式,或者可以在预处理上运行Gelly图算法之前使用SQL查询扫描,过滤和聚合批处理表数据。
两个规划者之间的主要差异
Blink将批处理作业视为流式传输的特例。因此,也不支持Table和DataSet之间的转换,批处理作业不会转换为Dataset程序,而是转化为DataStream程序,与流作业相同。Blink planner不支持BatchTableSource,使用有界StreamTableSource而不是它。Blink规划器仅支持全新Catalog,不支持ExternalCatalog已弃用。- 旧计划程序和Blink计划程序的
FilterableTableSource的实现是不兼容的。 旧计划者将PlannerExpressions推向FilterableTableSource,而Blink计划者将推下表达式。- 基于字符串的键值配置选项(有关详细信息,请参阅有关配置的文档)仅用于Blink规划器。
PlannerConfig在两个规划者中的实现(CalciteConfig)是不同的。- Blink规划器将多个接收器优化为一个DAG(仅在
TableEnvironment上支持,而不在StreamTableEnvironment上支持)。 旧规划器将始终将每个接收器优化为新的DAG,其中所有DAG彼此独立。- 现在,旧规划器不支持目录统计,而Blink规划器则支持。
TableEnvironmetnt认识
和DataStream一样,Table API和SQL中具有相同的基本编程模型。首先需要构建对应的TableEnvironment创建关系型编程环境,才能够在程序中使用Table API和SQL来编写程序,另外Table API和SQL接口可以在应用中同时使用。Flink SQL基于Apache Cacite框架实现SQL协议,是构建在Table API之上的更高级接口。
表API和SQL程序的结构
// JAVA
TableEnvironment tableEnv = ...; // see "Create a TableEnvironment" section
// register a Table
tableEnv.registerTable("table1", ...) // or
tableEnv.registerTableSource("table2", ...); // or
tableEnv.registerExternalCatalog("extCat", ...);
// register an output Table
tableEnv.registerTableSink("outputTable", ...);
// create a Table from a Table API query
Table tapiResult = tableEnv.scan("table1").select(...);
// create a Table from a SQL query
Table sqlResult = tableEnv.sqlQuery("SELECT ... FROM table2 ... ");
// emit a Table API result Table to a TableSink, same for SQL result
tapiResult.insertInto("outputTable");
// execute
tableEnv.execute("java_job");
创建一个TableEnvironment
这TableEnvironment是Table API和SQL集成的核心概念,他主要负责:
- 在
Table内部目录中注册表 - 注册一个外部表
- 执行
SQL查询 - 注册用户行为的(标量,表或聚合)函数
- 将
DataStream或者DataSet转换为Table - 持有对
ExecutionEnvironment或的引用StreamExecutionEnvironment
表始终绑定到特定的TableEnvironment。 不可能在同一查询中组合不同TableEnvironments的表,例如,加入或联合它们。
通过使用StreamExecutionEnvironment或ExecutionEnvironment和可选的TableConfig调用静态BatchTableEnvironment.create()或StreamTableEnvironment.create()方法来创建TableEnvironment。 TableConfig可用于配置TableEnvironment或自定义查询优化和转换过程.
开发环境构建
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-core</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<!--Flink Table API / sql-->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java-bridge_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
&l

本文深入探讨了Apache Flink中的TableAPI和SQL,详细讲解了其核心概念、编程模型及如何在批处理和流处理场景中高效使用。涵盖了TableEnvironment的创建、内部目录注册、TableSource使用、复杂TableAPI操作如聚合、窗口计算等,以及与DataStream和DataSetAPI的集成。
最低0.47元/天 解锁文章
315

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



