大数据学习之Flink——15TableAPI 和 Flink SQL

Table API 以及 SQL 能够统一处理批量和实时计算业务, 无须切换修改任何应用代码就能够基于同一套 API 编写流式应用和批量应用, 从而达到真正意义的批流统一

在这里插入图片描述
在这里插入图片描述

一. 开发环境构建

  • 在使用 Table API 和 SQL 开发 Flink 应用之前, 通过添加 Maven 的依赖配置到项目中, 在本地工程中引入相应的依赖库, 库中包含了 TableAPI 和 SQL 接口。

    <dependency> 
    	<groupId>org.apache.flink</groupId> 
    	<artifactId>flink-table-planner_2.11</artifactId> 
    	<version>1.9.1</version>
    </dependency> 
    <dependency> 
    	<groupId>org.apache.flink</groupId> 
    	<artifactId>flink-table-api-scala-bridge_2.11</artifactId> 
    	<version>1.9.1</version>
    </dependency>
    

二. TableEnvironment

  1. 和 DataStream API 一样,Table API 和 SQL 中具有相同的基本编程模型。首先需要构 建对应的 TableEnviroment 创建关系型编程环境, 才能够在程序中使用 Table API 和 SQL 来编写应用程序, 另外 Table API 和 SQL 接口可以在应用中同时使用, Flink SQL 基于 Apache Calcite 框架实现了 SQL 标准协议, 是构建在 Table API 之上的更高级接口。

  2. 首先需要在环境中创建 TableEnvironment 对象, TableEnvironment 中提供了注册内部表、执行 Flink SQL 语句、注册自定义函数等功能。根据应用类型的不同,TableEnvironment创建方式也有所不同,但是都是通过调用 create()方法创建。

  3. 流计算环境下创建 TableEnviroment:

    val streamEnv: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    
    val tableEnv1: StreamTableEnvironment = StreamTableEnvironment.create(streamEnv)
    
    val settings: EnvironmentSettings = EnvironmentSettings.newInstance().useOldPlanner().inStreamingMode().build()
    val tableEnv2: StreamTableEnvironment = StreamTableEnvironment.create(streamEnv, settings)
        
    

三. Table API

1. 创建Table

1 Table API 中已经提供了 TableSource 从外部系统获取数据,例如常见的数据库、文件 系统和 Kafka 消息队列等外部系统。
2 在 Flink 中创建一张表有两种方法:

  1. 从一个文件中导入表结构(Structure) (常用于批计算)(静态)
  2. 从 DataStream 或者 DataSet 转换成 Table (动态)
  1. 从文件中创建Table(静态表)
    Flink 允许用户从本地或者分布式文件系统中读取和写入数据,在 Table API 中可以通 过 CsvTableSource 类来创建,只需指定相应的参数即可。但是文件格式必须是 CSV 格式的。 其他文件格式也支持(在 Flink 还有 Connector 的来支持其他格式或者定义TableSource)

    package com.hjf.table
    
    import org.apache.flink.api.scala.typeutils.Types
    import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
    import org.apache.flink.table.api.EnvironmentSettings
    import org.apache.flink.table.api.scala.StreamTableEnvironment
    import org.apache.flink.table.sources.CsvTableSource
    
    object TestTableEnvironment {
         
      def main(args: Array[String]): Unit = {
         
        // 创建环境方法1
        val streamEnv: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
        val tableEnv1: StreamTableEnvironment = StreamTableEnvironment.create(streamEnv)
        
        // 创建环境方法2
        val settings: EnvironmentSettings = EnvironmentSettings.newInstance().useOldPlanner().inStreamingMode().build()
        val tableEnv2: StreamTableEnvironment = StreamTableEnvironment.create(streamEnv, settings)
    
        // 创建CSV格式的TableSource
        val fileSource: CsvTableSource = new CsvTableSource("/station.log",
          Array[String]("sid", "call_out", "call_in", "call_type", "call_time", "duration"),
          Array(Types.STRING, Types.STRING, Types.STRING, Types.STRING, Types.LONG, Types.LONG)
        )
        // 注册Table, 表名为t_log
        tableEnv1.registerTableSource("t_log", fileSource)
        // 转换成Table对象, 并打印表结构
        tableEnv1.scan("t_log").printSchema()
      }
    }
    
    

    在这里插入图片描述

  2. 从 DataStream 中创建 Table(动态表)

    package com.hjf.table
    
    import com.hjf.dataSource.StationLog
    import org.apache.flink.streaming.api.scala.{
         DataStream, StreamExecutionEnvironment}
    import org.apache.flink.table.api.Table
    import org.apache.flink.table.api.scala.StreamTableEnvironment
    
    object TestCreateTableForStream {
         
      def main(args: Array[String]): Unit = {
         
        // 创建环境方法1
        val streamEnv: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
        val tableEnv: StreamTableEnvironment = StreamTableEnvironment.create(streamEnv)
        import org.apache.flink.streaming.api.scala._
        //val stream: DataStream[StationLog] = streamEnv.socketTextStream("node01", 8888)
        val stream = streamEnv.readTextFile(getClass.getResource("/station.log").getPath)
          .map(one => {
         
              val arr: Array[String] = one.split(",")
              new StationLog(arr(0).trim, arr(1).trim, arr(2).trim, arr(3).trim, arr(4).trim<
第一章 整体介绍 2 1.1 什么是 Table API Flink SQL 2 1.2 需要引入的依赖 2 1.3 两种 planner(old & blink)的区别 4 第二章 API 调用 5 2.1 基本程序结构 5 2.2 创建表环境 5 2.3 在 Catalog 中注册表 7 2.3.1 表(Table)的概念 7 2.3.2 连接到文件系统(Csv 格式) 7 2.3.3 连接到 Kafka 8 2.4 表的查询 9 2.4.1 Table API 的调用 9 2.4.2 SQL 查询 10 2.5 将 DataStream 转换成表 11 2.5.1 代码表达 11 2.5.2 数据类型与 Table schema 的对应 12 2.6. 创建临时视图(Temporary View) 12 2.7. 输出表 14 2.7.1 输出到文件 14 2.7.2 更新模式(Update Mode) 15 2.7.3 输出到 Kafka 16 2.7.4 输出到 ElasticSearch 16 2.7.5 输出到 MySql 17 2.8 将表转换成 DataStream 18 2.9 Query 的解释执行 20 1. 优化查询计划 20 2. 解释成 DataStream 或者 DataSet 程序 20 第三章 流处理中的特殊概念 20 3.1 流处理关系代数(表,及 SQL)的区别 21 3.2 动态表(Dynamic Tables) 21 3.3 流式持续查询的过程 21 3.3.1 将流转换成表(Table) 22 3.3.2 持续查询(Continuous Query) 23 3.3.3 将动态表转换成流 23 3.4 时间特性 25 3.4.1 处理时间(Processing Time) 25 3.4.2 事件时间(Event Time) 27 第四章 窗口(Windows) 30 4.1 分组窗口(Group Windows) 30 4.1.1 滚动窗口 31 4.1.2 滑动窗口 32 4.1.3 会话窗口 32 4.2 Over Windows 33 1) 无界的 over window 33 2) 有界的 over window 34 4.3 SQL 中窗口的定义 34 4.3.1 Group Windows 34 4.3.2 Over Windows 35 4.4 代码练习(以分组滚动窗口为例) 36 第五章 函数(Functions) 38 5.1 系统内置函数 38 5.2 UDF 40 5.2.1 注册用户自定义函数 UDF 40 5.2.2 标量函数(Scalar Functions) 40 5.2.3 表函数(Table Functions) 42 5.2.4 聚合函数(Aggregate Functions) 45 5.2.5 表聚合函数(Table Aggregate Functions) 47
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值