18-flink-1.10.1-Table API & Flink SQL

目录

1 Table API 和Flink SQL 是什么

2 简单使用table api 和 flink SQL

2.1 引入依赖

2.2 代码demo

 3 基本程序结构

 4 创建TableEnvironment

5 table

5.1 table 是什么

 5.2 创建表 

 5.3 代码演示

​ 6 表的查询

6.1 表的查询 Table API 

6.2 表的查询 Flink SQL

 6.3 代码示例

7 将DataStream 转换成表

8 输出表

8.1 什么是输出表

 8.2 输出到文件

 9 更新模式

​ 9.1 输出到kafak

 9.2 输出到elasticsearch

9.3 输出到mysql

10 将Table 转换成DataStream

11 查看执行计划

12 动态表 

​ 12.1 动态表

12.2 动态表和持续查询

12.3 将流转换成动态表 

12.4 持续查询 

12.5 将动态表转换成DataStream

13 时间特性

​ 13.1 定义处理时间(processing time )

13.2 定义时间时间(event time)

​ 14 窗口


1 Table API 和Flink SQL 是什么

Flink 对流处理和批处理,提供了统一的上层API

Table API 是一套内嵌在Java 和Scala 语言中的查询API,它允许以非常直观的方式组合来自一些关系院选符的查询

Flink 的SQL支持基于实现了SQL标准的Apache calcite

 

2 简单使用table api 和 flink SQL

2.1 引入依赖

① flink-table-common
通过自定义函数,格式等扩展表生态系统的通用模块。
② flink-table-api-java-bridge
使用Java编程语言支持DataStream / DataSet API的Table&SQL API。
③ flink-table-api-scala-bridge
使用Scala编程语言支持DataStream / DataSet API的Table&SQL API。
④ flink-table-planner
表程序规划器和运行时。

link-table-planner引入后会自动引入上面①~④四个jar 包

老版本planner

 <!-- flink-table-planner -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-planner_2.12</artifactId>
            <version>1.10.1</version>
        </dependency>

flink-table-planner-blink

新版本planner

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-planner-blink_2.12</artifactId>
            <version>1.10.1</version>
        </dependency>

2.2 代码demo

package com.study.liucf.table

import com.study.liucf.bean.LiucfSensorReding
import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.Table
import org.apache.flink.table.api.scala._

object LiucfTableAPIDemo1 {
  def main(args: Array[String]): Unit = {

    val env = StreamExecutionEnvironment.getExecutionEnvironment

    val inputStream: DataStream[String] = env.readTextFile("src\\main\\resources\\sensor.txt")

    val ds: DataStream[LiucfSensorReding] = inputStream.map(r=>{
      val arr = r.split(",")
      LiucfSensorReding(arr(0),arr(1).toLong,arr(2).toDouble)
    })
    //定义表环境
    val tableEnv = StreamTableEnvironment.create(env)
    //基于流创建一张表
    val flinkTable: Table = tableEnv.fromDataStream(ds)
    //第一种方式:调用table api 进行转换
    val resultFlinkTable1 = flinkTable
      .select("id,temperature")
      .filter("id == 'sensor_1'")
    resultFlinkTable1.printSchema()
    //基于表创建流
    val resStream1 = tableEnv.toAppendStream[(String,Double)](resultFlinkTable1)
    //输出结果
    resStream1.print("Table API")
    //第二种方式:把 Flink Table 注册成一张表然后进行转换
    tableEnv.createTemporaryView("flinkTableLiucf", flinkTable)
    //转换sql
    val flinkSQLStr = "select id,temperature from flinkTableLiucf where id = 'sensor_1'"
    //执行转换
    val resultFlinkTable2: Table = tableEnv.sqlQuery(flinkSQLStr)
    resultFlinkTable2.printSchema()
    //基于表创建流
    val resStream2 = tableEnv.toAppendStream[(String,Double)](resultFlinkTable2)
    //输出结果
    resStream2.print("Flink SQL")
    env.execute("table api test")
  }

}

 3 基本程序结构

 4 创建TableEnvironment

创建表的执行环境,需要将flink流处理的执行环境传入

val tableEnv = StreamTaleEnvironment.create(env)

TableEnvironment 是flink 中集成Table API 和 SQL 的核心概念,所有对表的基本操作都基于TableEnvironment

- 注册 Catalog

     Catalog描述了数据集的属性和数据集的位置,这样用户不需要指出数据集的位置就可以获得某个数据集。

- 在Catalog中注册表

- 执行SQL查询

- 注册用户自定义函数(UDF)

5 table

5.1 table 是什么

 5.2 创建表 

 5.3 代码演示

package com.study.liucf.table

import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.{DataTypes, Table}
import org.apache.flink.table.api.scala.StreamTableEnvironment
import org.apache.flink.table.descriptors.{FileSystem, OldCsv, Schema}
import org.apache.flink.table.types.{DataType, FieldsDataType}

object LiucfTableAPIConnectFile {
  def main(args: Array[String]): Unit = {

    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    val tableEnv = StreamTableEnvironment.create(env)
    val path = "src/main/resources/sensor.csv"
    tableEnv
      .connect(new FileSystem().path(path))//定义表的数据来源,和外部系统建立连接
      .withFormat(new OldCsv())//定义数据格式化方式
      .withSchema(new Schema() //定义表的结构
        .field("id",DataTypes.STRING())
        .field("timestamp",DataTypes.BIGINT())
        .field("temperature",DataTypes.DOUBLE())
      ).createTemporaryTable("file_table_test")//创建临时表
    //把临时表转换成 Table
    val table: Table = tableEnv.from("file_table_test")
    table.printSchema()
    //把TAble转换成数据流
    val value = tableEnv.toAppendStream[(String,Long,Double)](table)
    value.print("Table API Connect File")

    env.execute("Table API")
  }

}

 6 表的查询

6.1 表的查询 Table API 

6.2 表的查询 Flink SQL

 6.3 代码示例

查询转换参考2.2

package com.study.liucf.table

import com.study.liucf.bean.LiucfSensorReding
import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.Table
import org.apache.flink.table.api.scala._

object LiucfTableAPIDemo1 {
  def main(args: Array[String]): Unit = {

    val env = StreamExecutionEnvironment.getExecutionEnvironment

    val inputStream: DataStream[String] = env.readTextFile("src\\main\\resources\\sensor.txt")

    val ds: DataStream[LiucfSensorReding] = inputStream.map(r=>{
      val arr = r.split(",")
      LiucfSensorReding(arr(0),arr(1).toLong,arr(2).toDouble)
    })
    //定义表环境
    val tableEnv = StreamTableEnvironment.create(env)
    //基于流创建一张表
    val flinkTable: Table = tableEnv.fromDataStream(ds)
    //第一种方式:调用table api 进行转换
    val 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值