Flink学习笔记之TableAPI

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

Flink中Table API & SQL简单介绍

对于像DataFrame这样的关系型编程接口,因其强大且灵活的表达能力,能够让用户通过非常丰富的接口对数据进行处理,有效降低了用户的使用成本,近年来逐渐成为主流大数据处理框架主要接口形式之一。Flink也提供了关系型编程接口Table API以及基于TableAPISQL API,让用户能够通过使用结构化编程接口高效的构建Flink应用。同时Table API以及SQL能够统一处理批量和实时计算业务,无需切换到修改任何应用代码就能够基于同一套API编写流式应用和批量应用,从而达到真正意义的批流统一。

Apache Flink具有两个关系API - 表APISQL- 用于统一流和批处理。Table APIScalaJava的语言集成查询API,允许以非常直观的方式组合来自关系运算符的查询,Table APISQL接口彼此紧密集成,以及FlinkDataStreamDataSet API。您可以轻松地在基于API构建的所有API和库之间切换。例如,您可以使用CEP库从DataStream中提取模式,然后使用Table API分析模式,或者可以在预处理上运行Gelly图算法之前使用SQL查询扫描,过滤和聚合批处理表数据。

两个规划者之间的主要差异

  1. Blink将批处理作业视为流式传输的特例。因此,也不支持Table和DataSet之间的转换,批处理作业不会转换为Dataset程序,而是转化为DataStream程序,与流作业相同。
  2. Blink planner不支持BatchTableSource,使用有界StreamTableSource而不是它。
  3. Blink规划器仅支持全新Catalog,不支持ExternalCatalog已弃用。
  4. 旧计划程序和Blink计划程序的FilterableTableSource的实现是不兼容的。 旧计划者将PlannerExpressions推向FilterableTableSource,而Blink计划者将推下表达式。
  5. 基于字符串的键值配置选项(有关详细信息,请参阅有关配置的文档)仅用于Blink规划器。
  6. PlannerConfig在两个规划者中的实现(CalciteConfig)是不同的。
  7. Blink规划器将多个接收器优化为一个DAG(仅在TableEnvironment上支持,而不在StreamTableEnvironment上支持)。 旧规划器将始终将每个接收器优化为新的DAG,其中所有DAG彼此独立。
  8. 现在,旧规划器不支持目录统计,而Blink规划器则支持。

TableEnvironmetnt认识

DataStream一样,Table APISQL中具有相同的基本编程模型。首先需要构建对应的TableEnvironment创建关系型编程环境,才能够在程序中使用Table APISQL来编写程序,另外Table APISQL接口可以在应用中同时使用。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

TableEnvironmentTable APISQL集成的核心概念,他主要负责:

  • Table内部目录中注册表
  • 注册一个外部表
  • 执行SQL查询
  • 注册用户行为的(标量,表或聚合)函数
  • DataStream或者DataSet转换为Table
  • 持有对ExecutionEnvironment或的引用StreamExecutionEnvironment

表始终绑定到特定的TableEnvironment。 不可能在同一查询中组合不同TableEnvironments的表,例如,加入或联合它们。

通过使用StreamExecutionEnvironmentExecutionEnvironment和可选的TableConfig调用静态BatchTableEnvironment.create()StreamTableEnvironment.create()方法来创建TableEnvironmentTableConfig可用于配置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
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值