Flink系列Table API和SQL之:创建表环境和创建表
admin
2024-05-03 17:07:15
0

Flink系列Table API和SQL之:创建表环境和创建表

  • 一、快速上手Table API和SQL
  • 二、创建表环境
  • 三、创建表
    • 1.连接器表(Connector Tables)
    • 2.虚拟表(Virtual Tables)

一、快速上手Table API和SQL

创建表环境

TableEnvironment tableEnv = ...;

创建输入表,连接外部系统读取数据

tableEnv.executeSql("CREATE TEMPORARY TABLE inputTable ... WITH ('connector' = ... )");

注册一个表,连接到外部系统,用于输出

tableEnv.executeSql("CREATE TEMPORARY TABLE outputTable ... WITH ('connector' = ... )");

执行SQL对表进行查询转换,得到一个新的表

Table table1 = tableEnv.sqlQuery("SELECT ... FROM inputTable ...");

使用Table API对表进行查询转换,得到一个新的表

Table table2 = tableEnv.from("inputTable").select(...);

将得到的结果写入输出表

TableResult tableResult = table1.executeInsert("outputTable");

二、创建表环境

对于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。

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.TableEnvironment;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;public class CommonApiTest {public static void main(String[] args) {StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(1);StreamTableEnvironment talbeEnv = StreamTableEnvironment.create(env);//1。定义环境配置来创建表执行环境EnvironmentSettings settings = EnvironmentSettings.newInstance().inStreamingMode().useBlinkPlanner().build();TableEnvironment tableEnv = TableEnvironment.create(settings);//2.基于blink版本planner进行批处理EnvironmentSettings settings2 = EnvironmentSettings.newInstance().inBatchMode().useBlinkPlanner().build();TableEnvironment tableEnv3 = TableEnvironment.create(settings2);}
}

三、创建表

表(Table)是关系型数据库中数据存储的基本形式,也是SQL执行的基本对象。Flink中的表是由多个行数据构成的,每个行(Row)又可以有定义好的多个列(Column)字段。整体来看,表就是固定类型的数据组成的二维矩阵。

为了方便的查询表,表环境中会维护一个目录(Catalog)和表的对应关系。所以表都是通过Catalog来进行注册创建的。表在环境中有一个唯一的ID,由三部分组成:目录(catalog)名,数据库(database)名,以及表名。在默认情况下,目录名为default_catalog,数据库名为default_database。所以如果我们直接创建一个叫做MyTable的表,它的ID就是:default_catalog.default_database.MyTable

具体创建表的方式,有通过连接器(connector)和虚拟表(virtual tables)两种。

1.连接器表(Connector Tables)

  • 最直观的创建表的方式,就是通过连接器(connector)连接到一个外部系统,然后定义出对应的表结构。例如我们可以连接到Kafka或者文件系统,将存储在这些外部系统的数据以表的形式定义出来,这样对表的读写就可以通过连接器转换成对外部系统的读写了。当我们在表环境中读取这张表,连接器就会从外部系统读取数据并进行转换。而当我们向这张表写入数据,连接器就会将数据输出(Sink)到外部系统中。
  • 在代码中,可以调用表环境的executeSql()方法,可以传入一个DDL作为参数执行SQL操作。我们传入一个CREATE语句进行表的创建,并通过WITH关键字指定连接到外部系统的连接器:
tableEnv.executeSql("CREATE [TEMPORARY] TABLE MyTable ... WITH ('connector' = ... )");

这里的TEMPORARY关键字可以省略。这里没有定义Catalog和Database,所以都是默认的,表的完整ID就是default_catalog.default_database.MyTable。如果希望使用自定义的目录名和库名,可以在环境中进行设置:

tEnv.useCatalog("custom_catalog");
tEnv.useDatabase("custom_database");

这样创建的表完整ID就变成了custom_catalog.custom_database.MyTable。之后在表环境中创建的所有表,ID也会都以custom_catalog.custom_database作为前缀。

        //2。创建表String creatDDL = "CREATE TABLE clickTable (" +"user STRING, " +"url STRING, " +"ts BIGINT " +") WITH (" +" 'connector' = 'filesystem',"+" 'path' = '/Users/fei.yang4/project/learn/src/main/java/com/bigdata/plus/flink" +"/input/clicks.txt'," +" 'format' = 'csv'" +")";tableEnv.executeSql(creatDDL);//创建一张用于输出的表//2。创建表String creatOutDDL = "CREATE TABLE outTable (" +"user STRING, " +"url STRING, " +"ts BIGINT " +") WITH (" +" 'connector' = 'filesystem',"+" 'path' = '/Users/fei.yang4/project/learn/src/main/java/com/bigdata/plus/flink" +"/input/output.txt'," +" 'format' = 'csv'" +")";tableEnv.executeSql(creatOutDDL);

2.虚拟表(Virtual Tables)

  • 在环境中注册之后,我们就可以在SQL中直接使用这张表进行查询转换了。
Table newTable = tableEnv.sqlQuery("SELECT ... FROM MyTable ...");
  • 这里调用了表环境的sqlQuery()方法,直接传入一条SQL语句作为参数执行查询,得到的结果是一个Table对象。Table是Table API中提供的核心接口类,就代表了一个Java中定义的表实例。

  • 得到的newTable是一个中间转换结果,如果之后又希望直接使用这个表执行SQL,又该怎么做呢?由于newTable是一个Table对象,并没有在表环境中注册。所以我们还需要将这个中间结果表注册到环境中,才能在SQL中使用:

tableEnv.createTemporaryView("NewTable",newTable);
  • 我们发现,这里的注册其实是创建了一个虚拟表(Virtual Table)。这个概念与SQL语法中的视图(View)非常类似,所以调用的方法也叫作创建虚拟视图(createTemporaryView)。视图之所以是虚拟的,是因为我们并不会直接保存这个表的内容,并没有实体。只是在用到这张表的时候,会将它对应的查询语句嵌入到SQL中。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...