文章目录


对于 Flink 这样的流处理框架来说,数据流和表在结构上还是有所区别的。所以使用 Table API 和 SQL 需要一个特别的运行时环境,这就是所谓的“表环境”(TableEnvironment)。它主要负责:
(1)注册 Catalog 和表;
(2)执行 SQL 查询;
(3)注册用户自定义函数(UDF);
(4)DataStream 和表之间的转换。

这里的 Catalog 就是“目录”,与标准 SQL 中的概念是一致的,主要用来管理所有数据库(database)和表(table)的元数据(metadata)。通过 Catalog 可以方便地对数据库和表进行查询的管理,所以可以认为我们所定义的表都会“挂靠”在某个目录下,这样就可以快速检索。在表环境中可以由用户自定义 Catalog,并在其中注册表和自定义函数(UDF)。默认的 Catalog就叫作 default_catalog。

每个表和 SQL 的执行,都必须绑定在一个表环境(TableEnvironment)中。TableEnvironment是 Table API 中提供的基本接口类,可以通过调用静态的 create()方法来创建一个表环境实例。方法需要传入一个环境的配置参数 EnvironmentSettings,它可以指定当前表环境的执行模式和计划器(planner)。执行模式有批处理和流处理两种选择,默认是流处理模式;计划器默认使用 blink planner。当然早期版本的时候,也有planner

public class CommonApiTest {
    public static void main(String[] args) {

        //1.定义流环境配置来创建表执行环境
        EnvironmentSettings streamSettings = EnvironmentSettings.newInstance()
                .inStreamingMode() //流环境
                .useBlinkPlanner()
                .build();

        TableEnvironment.create(streamSettings);

        //2.定义批环境配置来创建表执行环境(blink版本planner)
        EnvironmentSettings batchSetting = EnvironmentSettings.newInstance()
                .inBatchMode() //批处理环境
                .useBlinkPlanner()
                .build();

        TableEnvironment.create(batchSetting);

        //3.基于老版本的planner进行流处理
        EnvironmentSettings oldStreamSettings = EnvironmentSettings.newInstance()
                .inStreamingMode() //流处理环境
                .useOldPlanner()
                .build();

        TableEnvironment.create(oldStreamSettings);


        //4.基于老版本的planner进行批处理 (老版本还没有真正意义上的批流通一)
        ExecutionEnvironment batchEnv = ExecutionEnvironment.getExecutionEnvironment();
        BatchTableEnvironment batchTableEnvironment = BatchTableEnvironment.create(batchEnv);
        
    }
}

对于流处理场景,其实默认配置就完全够用了。所以我们也可以用另一种更加简单的方式来创建表环境:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

这 里 我 们 引 入 了 一 个 “ 流 式 表 环 境 ”( StreamTableEnvironment ), 它 是 继 承 自TableEnvironment 的子接口。调用它的 create()方法,只需要直接将当前的流执行环境(StreamExecutionEnvironment)传入,就可以创建出对应的流式表环境了。