Flink Table API及Flink SQL

Flink快速入门-11.Flink 中 Table API 和 SQL 在 Spark 中,最基础的编程模型是 RDD 编程。但是并不是所有的程序员都能够用 RDD 很好地处理数据,所以 Spark 社区在 RDD 的基础上增加了关系型编程接口 Spark DataFrame 和 Spark SQL。Spark DataFrame 和 Spark SQL 的出现,大大降低了 Spark 的使用门槛,使那些并不擅长 Scala 以及只会 SQL 的程序员和数据分析师也能利用 Spark 的分析能力进行大数据分析。 阅读详情

Flink Table API及Flink SQL

相关博客:

Flink-Table API 和 Flink SQL简介 | 新老版本Flink批流处理对比 | 读取文件和Kafka消费数据 | API 和 SQL查询表

flink-Table&sql-碰到的几个问题记录

一、概述

  • Flink 对批处理和流处理,提供了统一的上层 API
  • Table API 是一套内嵌在 Java 和 Scala 语言中的查询API,它允许以非常直观的方式组合来自一些关系运算符的查询
  • Flink 的 SQL 支持基于实现了 SQL 标准的 Apache Calcite

https://www.notion.so

导入依赖:

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

<!-- 写入文件以及jdbc依赖 -->
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-csv</artifactId>
    <version>1.10.1</version>
</dependency>
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-jdbc_2.12</artifactId>
    <version>1.10.1</version>
    <scope>provided</scope>
</dependency>

简单使用代码:

package com.root.table;

import com.root.SensorReading;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.java.StreamTableEnvironment;
import org.apache.flink.types.Row;

/**
 * @author Kewei
 * @Date 2022/3/7 16:31
 */

public class TableTest1_Example {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        
        // 1.创建一个Table环境
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

        // 2.读取文件,并格式化
        String path = "data/sensor.txt";
        DataStreamSource<String> inputStream = env.readTextFile(path);
        SingleOutputStreamOperator<SensorReading> dataStream = inputStream.map(line -> {
            String[] fields = line.split(",");
            return new SensorReading(fields[0], new Long(fields[1]), new Double(fields[2]));
        });
        
        // 3.创建Table
        Table dataTable = tableEnv.fromDataStream(dataStream);
        
        // 4.简单查询
        Table resultTable = dataTable.select("id, temperature")
                .where("id = 'sensor_1'");
        
        // 5. 创建临时视图
        tableEnv.createTemporaryView("sensor", dataTable);
        
        // 6.使用sql查询
        String sql = "select id, temperature from sensor where id = 'sensor_1'";
        Table resultSqlTable = tableEnv.sqlQuery(sql);
        
        // 7.Table转换为DataStream,并打印输出
        tableEnv.toAppendStream(resultTable, Row.class).print("result");
        tableEnv.toAppendStream(resultSqlTable,Row.class).print("sql");

        env.execute();

    }
}

二、基本程序结构

Table API和SQL的程序结构,与流式处理的程序结构十分类似。

StreamTableEnvironment tableEnv = ... // 创建表的执行环境

// 创建一张表,用于读取数据
tableEnv.connect(...).createTemporaryTable("inputTable");

// 注册一张表,用于把计算结果输出,和读取表相同,需要输出时,
// 需要resultTable.insertInto("outputTable");
tableEnv.connect(...).createTemporaryTable("outputTable");

// 通过 Table API 查询算子,得到一张结果表
Table result = tableEnv.from("inputTable").select(...);

// 通过SQL查询语句,得到一张结果表
Table sqlResult = tableEnv.sqlQuery("SELECT ... FROM inputTable ...");

// 将结果表写入输出表中
result.insertInto("outputTable");

三、Table API批处理和流处理

新版本blink,真正把批处理、流处理都以DataStream实现

创建环境 样例代码

package com.root.table;

import org.apache.flink.api.java.ExecutionEnvironment;
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.java.BatchTableEnvironment;
import org.apache.flink.table.api.java.StreamTableEnvironment;

/**
 * @author Kewei
 * @Date 2022/3/7 16:47
 */

public class TableTest2_CommonAPI {
    public static void main(String[] args) {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

        // 基于老版本的planner的流处理
        EnvironmentSettings oldStreamSettings = EnvironmentSettings.newInstance()
                .useOldPlanner()
                .inStreamingMode()
                .build();
        StreamTableEnvironment oldStreamTableEnv = StreamTableEnvironment.create(env, oldStreamSettings);

        // 基于老版本的planner的批处理
        ExecutionEnvironment batchEnv = ExecutionEnvironment.getExecutionEnvironment();
        BatchTableEnvironment oldBatchEnv = BatchTableEnvironment.create(batchEnv);

        // 基于Blink的流处理
        EnvironmentSettings blinkStreamSettings = EnvironmentSettings.newInstance()
                .useBlinkPlanner()
                .inStreamingMode()
                .build();
        StreamTableEnvironment blinkStreamTableEnv = StreamTableEnvironment.create(env, blinkStreamSettings);

        // 基于Blink的批处理
        EnvironmentSettings blinkBatchSettings = EnvironmentSettings.newInstance()
                .useBlinkPlanner()
                .inBatchMode()
                .build();
        TableEnvironment blinkBatchTableEnv = TableEnvironment.create(blinkBatchSettings);

    }
}

3.1 表 Table

  • TableEnvironment可以注册目录Catalog,并可以基于Catalog注册表
  • 表(Table)是由一个"标示符"(identifier)来指定的,由3部分组成:Catalog名、数据库(database)名和对象名
  • 表可以是常规的,也可以是虚拟的(视图,View)
  • 常规表(Table)一般可以用来描述外部数据,比如文件、数据库表或消息队列的数据,也可以直接从DataStream转换而来
  • 视图(View)可以从现有的表中创建,通常是table API或者SQL查询的一个结果集

3.2 创建表

TableEnvironment可以调用connect()方法,连接外部系统,并调用.createTemporaryTable()方法,在Catalog中注册表。

tableEnv
  .connect(...)    //    定义表的数据来源,和外部系统建立连接
  .withFormat(...)    //    定义数据格式化方法 new CSV()
  .withSchema(...)    //    定义表结构
  .createTemporaryTable("MyTable");    //    创建临时表

3.3 创建TableEnvironment

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

    StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

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

    • 注册Catalog
    • 在Catalog中注册表
    • 执行SQL查询
    • 注册用户自定义函数(UDF)
package com.root.table;

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.DataTypes;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.java.StreamTableEnvironment;
import org.apache.flink.table.descriptors.Csv;
import org.apache.flink.table.descriptors.FileSystem;
import org.apache.flink.table.descriptors.Schema;
import org.apache.flink.types.Row;

/**
 * @author Kewei
 * @Date 2022/3/7 17:15
 */

public class TableTest3_CommonAPI {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        // 创建Table环境
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

        // 读取文件,作为数据源
        String path = "data/sensor.txt";
        tableEnv.connect(new FileSystem().path(path))
                .withFormat(new Csv())
                .withSchema(new Schema()
                        .field("id", DataTypes.STRING())
                        .field("timestamp",DataTypes.BIGINT())
                        .field("temp",DataTypes.DOUBLE()))
                .createTemporaryTable("inputTable");

        // 查询表
        Table inputTable = tableEnv.from("inputTable");

        // 查看表结构
        inputTable.printSchema();

        // 转换为DataStream,并打印输出
        tableEnv.toAppendStream(inputTable, Row.class).print();

        env.execute();
    }
}

3.4 表的查询

  • Table API是集成在Scala和Java语言内的查询API
  • Table API基于代表"表"的Table类,并提供一整套操作处理的方法API;这些方法会返回一个新的Table对象,表示对输入表应用转换操作的结果
  • 有些关系型转换操作,可以由多个方法调用组成,构成链式调用结构

测试代码

package com.root.table;

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.DataTypes;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.java.StreamTableEnvironment;
import org.apache.flink.table.descriptors.Csv;
import org.apache.flink.table.descriptors.FileSystem;
import org.apache.flink.table.descriptors.Schema;
import org.apache.flink.types.Row;

/**
 * @author Kewei
 * @Date 2022/3/7 17:15
 */

public class TableTest4_CommonAPI {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        // 创建Table环境
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

        // 读取文件,作为数据源
        String path = "data/sensor.txt";
        tableEnv.connect(new FileSystem().path(path))
                .withFormat(new Csv())
                .withSchema(new Schema()
                        .field("id", DataTypes.STRING())
                        .field("timestamp",DataTypes.BIGINT())
                        .field("temp",DataTypes.DOUBLE()))
                .createTemporaryTable("inputTable");
        // 查询表
        Table inputTable = tableEnv.from("inputTable");
//        inputTable.printSchema();
//        tableEnv.toAppendStream(inputTable, Row.class).print();

        // 链式查询,并筛选
        Table resultTable = inputTable.select("id, temp")
                .filter("id === 'sensor_6'");

        // 分组,并聚合
        Table aggTable = inputTable.groupBy("id")
                .select("id, id.count as count, temp.avg as avgTemp");

        // 执行SQL
        tableEnv.sqlQuery("select id, temp from inputTable where id = 'sensor_6'");
        Table sqlAggTable = tableEnv.sqlQuery("select id, count(id) as cnt, avg(temp) as avgTemp from inputTable group by id");

        // 转换为DataStream,注意聚合之后的Table,需要使用toRetractStream,来转换为DataStream
        // 并且数据中含有true和false,false表示上一条保存的记录被删除,true则是新加入的数据
        tableEnv.toAppendStream(resultTable, Row.class).print("result");
        tableEnv.toRetractStream(aggTable, Row.class).print("agg");
        tableEnv.toRetractStream(sqlAggTable, Row.class).print("sqlagg");

        env.execute();
    }
}

Flink的Table API在更新数据时,实际是先删除原本的数据,再添加新数据

3.5 Table更新模式

  • 对于流式查询,需要声明如何在表和外部连接器之间执行转换
  • 与外部系统交换的消息类型,由更新模式(Uadate Mode)指定
  • 追加(Append)模式
    • 表只做插入操作,和外部连接器只交换插入(Insert)消息
  • 撤回(Retract)模式
    • 表和外部连接器交换添加(Add)和撤回(Retract)消息
    • 插入操作(Insert)编码为Add消息;删除(Delete)编码为Retract消息;更新(Update)编码为上一条的Retract和下一条的Add消息
  • 更新插入(Upsert)模式
    • 更新和插入都被编码为Upsert消息;删除编码为Delete消息

3.6 将数据写到文件中

写入到文件有局限,只能是批处理,且只能是追加写,不能是更新式的随机写。

测试代码

package com.root.table;

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.DataTypes;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.java.StreamTableEnvironment;
import org.apache.flink.table.descriptors.Csv;
import org.apache.flink.table.descriptors.FileSystem;
import org.apache.flink.table.descriptors.Schema;

/**
 * @author Kewei
 * @Date 2022/3/7 17:41
 */

public class TableTest5_FileOutput {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

        String path = "data/sensor.txt";

        tableEnv.connect(new FileSystem().path(path))
                .withFormat(new Csv())
                .withSchema(new Schema()
                        .field("id", DataTypes.STRING())
                        .field("timestamp", DataTypes.BIGINT())
                        .field("temp", DataTypes.DOUBLE()))
                .createTemporaryTable("inputTable");

        Table resultTable = tableEnv.from("inputTable").select("id, timestamp");
        Table sqlAggTable = tableEnv.sqlQuery("select id, count(id) cnt,avg(temp) avgTemp from inputTable group by id");

        String outputPath = "data/out.txt";
        tableEnv.connect(new FileSystem().path(outputPath))
                .withFormat(new Csv())
                .withSchema(new Schema()
                        .field("id", DataTypes.STRING())
                        .field("timestamp",DataTypes.BIGINT()))
                .createTemporaryTable("outputTable");
        resultTable.insertInto("outputTable");

        // 以下报错 AppendStreamTableSink requires that Table has only insert changes.
        // AppendStreamTableSink 需要表只能插入没有修改的数据(不能group by)
//        String outputPath2 = "data/out1.txt";
//        tableEnv.connect(new FileSystem().path(outputPath2))
//                .withFormat(new Csv())
//                .withSchema(new Schema()
//                        .field("id", DataTypes.STRING())
//                        .field("cnt",DataTypes.BIGINT())
//                        .field("avgTemp",DataTypes.DOUBLE()))
//                .createTemporaryTable("outputTable2");
//        sqlAggTable.insertInto("outputTable2");

        env.execute();
        
        // 旧版Flink可以用下面这条
        // env.execute();

        // 新版Flink需要用这条,上面那条会报错,报错如下
        // Exception in thread "main" java.lang.IllegalStateException:
        // No operators defined in streaming topology. Cannot execute.
        // tableEnv.execute("");

    }
}

注意输出到文件时,输出的目标文件不能存在!否则会报错。

3.7 读写Kafka

Kafka作为消息队列,和文件系统类似的,只能往里追加数据,不能修改数据。

tableEnv.connect(new Kafka()
                .version("universal")
                .topic("sensor")
                .property("zookeeper.connect", "localhost:2181")
                .property("bootstrap.servers", "localhost:9092")
        )
        .withFormat(new Csv())
        .withSchema(new Schema()
                .field("id", DataTypes.STRING())
                .field("timestamp", DataTypes.BIGINT())
                .field("temp", DataTypes.DOUBLE())
        )
        .createTemporaryTable("inputTable");

四、表和流的转换

4.1 将表Table转换成DataStream

  • 表可以转换为 DataStream 或 DataSet ,这样自定义流处理或批处理程序就可以继续在 Table API 或 SQL 查询的结果上运行了

  • 将表转换为 DataStream 或 DataSet 时,需要指定生成的数据类型,即要将表的每一行转换成的数据类型

  • 表作为流式查询的结果,是动态更新的

  • 转换有两种转换模式:追加(Appende)模式和撤回(Retract)模式

  • 追加模式

    • 用于表只会被插入(Insert)操作更改的场景
    DataStream<Row> resultStream = tableEnv.toAppendStream(resultTable,Row.class);
    
  • 撤回模式

    • 用于任何场景。有些类似于更新模式中Retract模式,它只有Insert和Delete两类操作。

    • 得到的数据会增加一个Boolean类型的标识位(返回的第一个字段),用它来表示到底是新增的数据(Insert),还是被删除的数据(Delete)。

      更新数据,会先删除旧数据,再插入新数据

4.2 将DataStream转换为Table

  • 对于一个DataStream,可以直接转换成Table,进而方便地调用Table API做转换操作

    DataStream<SensorReading> dataStream = ...;
    Table sensorTable = tableEnv.fromDataStream(dataStream);
    
  • 默认转换后的Table schema和DataStream中的字段定义一一对应,也可以单独指定出来

    DataStream<SensorReading> dataStream = ...;
    Table sensorTable = tableEnv.fromDataStream(dataStream,
                                               "id, timestamp as ts, temperature");
    

4.3 创建临时视图**(Temporary View)**

  • 基于DataStream创建临时视图
tableEnv.createTemporaryView("sensorView",dataStream);
tableEnv.createTemporaryView("sensorView",
                            dataStream, "id, timestamp as ts, temperature");
  • 基于Table创建临时视图
tableEnv.createTemporaryView("sensorView", sensorTable);

五、查看执行计划

  • Table API 提供了一种机制来解释计算表的逻辑和优化查询计划
  • 查看执行计划,可以通过TableEnvironment.explain(table)方法或TableEnvironment.explain()方法完成,返回一个字符串,描述三个计划
    • 优化的逻辑查询计划
    • 优化后的逻辑查询计划
    • 实际执行计划
String explaination = tableEnv.explain(resultTable);
System.out.println(explaination);

六、 流处理和关系代数的区别

相关博客:

Flink- 将表转换成DataStream | 查看执行计划 | 流处理和关系代数的区别 | 动态表 | 流式持续查询的过程 | 将流转换成动态表 | 持续查询 | 将动态表转换成 DS

Table API和SQL,本质上还是基于关系型表的操作方式;而关系型表、关系代数,以及SQL本身,一般是有界的,更适合批处理的场景。这就导致在进行流处理的过程中,理解会稍微复杂一些,需要引入一些特殊概念。

可以看到,其实关系代数(主要就是指关系型数据库中的表)和SQL,主要就是针对批处理的,这和流处理有天生的隔阂。

关系代数(表)/sql流处理
处理的数据对象字段元组的有界集合字段元组的无限序列
查询(Query)对数据的访问可以访问到完整的数据输入无法访问所有数据,必须持续"等待"流式输入
查询终止条件生成固定大小的结果集后终止永不停止,根据持续收到的数据不断更新查询结果

6.1 动态表(Dynamic Table)

我们可以随着新数据的到来,不停地在之前的基础上更新结果。这样得到的表,在Flink Table API概念里,就叫做“动态表”(Dynamic Tables)。

  • 动态表是 Flink 对流数据的 Table API 和 SQL 支持的核心概念
  • 与表示批处理数据的静态表不同,动态表是随时间变化的
  • 持续查询(Continuous Query)
    • 动态表可以像静态的批处理表一样进行查询,查询一个动态表会产生持续查询(Continuous Query)
    • 连续查询永远不会终止,并会生成另一个动态表
    • 查询(Query)会不断更新其动态结果表,以反映其动态输入表上的更改。

6.2 动态表和持续查询

在这里插入图片描述

流式表查询的处理过程:

  1. 流被转换为动态表
  2. 对动态表计算连续查询,生成新的动态表
  3. 生成的动态表转换成流

6.3 将流转换为动态表

  • 为了处理带有关系查询的流,必须先将其转换为表
  • 从概念上讲,流的每个数据记录,都被解释为对结果表的插入(Insert)修改操作

本质上,我们其实是从一个、只有插入操作的changelog(更新日志)流,来构建一个表来一条数据插入一条数据

在这里插入图片描述

6.4 持续查询

  • 持续查询,会在动态表上做计算处理,并作为结果生成新的动态表。

    与批处理查询不同,连续查询从不终止,并根据输入表上的更新更新其结果表。

    在任何时间点,连续查询的结果在语义上,等同于在输入表的快照上,以批处理模式执行的同一查询的结果。

下图为一个点击事件流的持续查询,是一个分组聚合做count统计的查询。

在这里插入图片描述

6.5 将动态表转换成DataStream

  • 与常规的数据库表一样,动态表可以通过插入(Insert)、更新(Update)和删除(Delete)更改,进行持续的修改
  • 将动态表转换为流或将其写入外部系统时,需要对这些更改进行编码

有三种类型:

  • 仅追加(Append-only)流

    • 仅通过插入(Insert)更改来修改的动态表,可以直接转换为仅追加流
  • 撤回(Retract)流

    • 撤回流是包含两类消息的流:添加(Add)消息和撤回(Retract)消息

    动态表通过将INSERT 编码为add消息、DELETE 编码为retract消息、UPDATE编码为被更改行(前一行)的retract消息和更新后行(新行)的add消息,转换为retract流。

  • Upsert(更新插入流)

    • Upsert流也包含两种类型的消息:Upsert消息和删除(Delete)消息

      通过将INSERT和UPDATE更改编码为upsert消息,将DELETE更改编码为DELETE消息,就可以将具有唯一键(Unique Key)的动态表转换为流。

6.6 将动态表转换成DataSream

在这里插入图片描述

Flink的Table API和Flink SQL 基本程序结构 Table API 和 SQL 的程序结构,与流式处理的程序结构十分类似 val tableEnv=。。。 // 创建表的执行环境 // 创建一张表,用于读取数据 tableEnv.connect(...).createTemporaryTable("inputTable") // 注册一张表,用于把计算结果输出 tableEnv.connect(...).createTemporaryTable("outputTable") // 通过 Table API 查询算子,得到一张结果表 val 阅读详情

相关推荐

Flink Table API和SQL的分析及使用(一)

Flink针对标准的流处理和批处理提供了两种关系型API:Table API 和 SQL。Table API 可以直接进行select、filter、join等操作;Flink SQL则是基于Apache Calcite实现标准的SQL,和SQL语言一致,适合大部分开发人员。 Flink Table API和SQL 捆绑在Flink-Table依赖中,如果要使用需要添加一下依赖: 以Flink 1...

s243471087的博客 1493

FlinkAPI开发之FlinkSQL

这里的依赖是一个Java的“桥接器”(bridge),主要就是负责Table API和下层DataStream API的连接支持,按照不同的语言分为Java版和Scala版。

Appreciate(欣赏) 2804

深入剖析:Apache Flink的Table API与SQL API之差异

Table API是Flink提供的一种声明式API,它允许开发者以一种类似于SQL的方式进行流处理和批处理。Table API的设计理念是将关系型数据库的操作模式引入到流处理中,使得熟悉SQL的开发者能够快速上手Flink。SQL API是Flink提供的一种查询语言接口,它允许开发者使用标准的SQL语句来处理数据流和批数据。SQL API的目的是让开发者能够利用SQL的强大功能来实现复杂的数据处理逻辑。

2402_85762143的博客 1128

Flink的Table和SQL的基本API

文章目录一个示例程序架构创建表环境创建表1、连接器2、虚拟表表的查询1、执行SQL查询2、调用Table API进行查询3、两种API的结合使用输出表表和流的转换1、将表转换成流2、将流转换成表3、支持的数据类型4、综合应用示例 一个示例 import com.yingzi.chapter05.Source.Event; import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator; import org.apache

yingzi的技术博客 1856

Flink Table API & SQL 基本操作

Flink 版本:1.13.5 本文主要展示了 Table API 和 SQL 程序的常见结构,如何创建注册 Table,查询 Table,以及如何输出 Table。 1. Table API & SQL 程序结构 在 Flink 中,Table API 和 SQL 可以看作联结在一起的一套 API,这套 API 的核心概念是一个可以用作 Query 输入和输出的表 Table。在我们程序中,输入数据可以定义成一张表,然后对这张表进行查询得到一张新的表,最后还可以定义一张用于输出的表,负责将处理.

SmartSi 1647

Flink Table API和SQL

一、Table API和SQL的基本使用 想使用Table API和SQL,首先要创建一个TableEnvironment。TableEnvironment对象是Table API和SQL集成的核心,通过TableEnvironment可以实现以下功能。 •通过内部目录创建表。 •通过外部目录创建表。 •执行SQL查询。 •注册一个用户自定义的Function。 •把DataStream或者DataSet转换成Table。 •持有ExecutionEnvironment或者StreamExecution.

科学的N次方 366

FlinkSQL-API

Flink SQL是提供的一种用于处理结构化和半结构化数据的API。通过使用SQL查询语言,用户可以在Flink中进行数据的转换、过滤、聚合等操作,而无需编写繁琐的代码。Flink SQL提供了与传统SQL数据库相似的语法,使得用户能够轻松地使用SQL来操作流式和批处理数据。是Flink提供的用于执行SQL查询语句的编程接口。通过,用户可以在Java或Scala中编写Flink SQL查询,并将其提交给Flink集群进行执行。

互联网知识分享 712

Flink 中 Table API & SQL 介绍

Flink学习笔记(三十):1.Table API & SQL        开头附上:Flink Table API & SQL 英文官方文档 1.1 背景         Flink虽然已经拥有了强大的 DataStream / DataSet API,而且...

扛麻袋的少年的博客 1779

flink table & sql 基本API使用

文章目录flink table & sql 基本API使用1 maven 依赖引用2 API2.1 创建表执行环境2.2 创建表2.3 表查询2.4 输出表2.5 表和流得相互转换2.5.1 将表(Table)转换成流(DataStream)2.5.2 将流(DataStream)转换成表(Table)2.4 SQL开窗滚动查询案例 flink table & sql 基本API使用 flink版本:1.13.1 scala版本:2.12 1 maven 依赖引用 <prope

qq_27242695的博客 587

Flink SQL - 1.Table API && Sql 入门 Demo

Flink Table API 与 Sql 简易入门 Demo 使用与分析。

BITDDD小栈 1309

ESP32脑机接口开发板:EEG信号采集与应用开发指南

脑机接口(BCI)技术通过采集脑电图(EEG)信号实现人机交互,其核心在于高精度生物电信号采集与实时处理。基于ESP32微控制器的开发平台结合专业级ADS1299 ADC芯片,可构建8通道EEG信号采集系统,支持250SPS采样率与可编程增益。这种嵌入式解决方案在科研教育领域具有显著优势,既能满足信号质量要求,又大幅降低开发门槛。典型应用包括实时脑电波可视化、注意力检测等BCI场景,通过Python生态工具链(如BrainFlow、LSL)可快速实现数据处理。开发时需注意电极阻抗控制(<10kΩ)和50/6

weixin_42518874的博客 343

Flink中Table API和SQL(一)

目录十一:Table API和SQL11.1 快速上手11.1.1 需要引入的依赖11.1.2 一个简单示例11.2 基本 API11.2.1 程序架构11.2.2 创建表环境11.2.3 创建表11.2.4 表的查询在 Flink 提供的多层级 API 中,核心是 DataStream API,这是我们开发流 处理应用的基本途径;底层则是所谓的处理函数(process function),可以访问事件的时间信 息、注册定时器、自定义状态,进行有状态的流处理。DataStream API 和处理函数比较通用

JiaXingNashishua的博客 1586

13 万字 C 语言从入门到精通保姆级教程2021 年版

13 万字C语言保姆级教程,从入门到精通。

李南江 61万+

【Flink】Table API和SQL API

Flink具有两个关系API - 表API和SQL - 用于统一流和批处理。Table API是Scala和Java的语言集成查询API,允许以非常直观的方式组合来自关系运算符的查询,例如选择,过滤和连接。无论输入是批输入还是流输入,任一接口中指定的查询都具有相同的语义并产生相同的结果。 flink版本:1.8.0 scala版本:2.11.8 1、使用maven引入相关依赖 &l...

hlp4207的博客 1381

vscode远程连接deepin出错:过程试图写入的管道不存在的解决方法

背景:昨天我用vscode使用ssh远程开发还处于正常状态,今天刚打开电脑,并启动deepin,再次使用vscode重新连接就出现异常。意思就是22号默认端口连接被拒绝,所以要先确定ssh是否连接。3.重新进入vscode里面,重新连接,如图成功连接。,查看port后面的端口号是不是22号。1.检查sshd是否启动。

qq_43573047的博客 2946

RH850从0搭建Autosar开发环境系列讲解 - 总目录

Davinci Autosar实战开发从0构建开发能力。OS,COM,DCM,BSWMM,ECUM,VLINK,XCP,MEMMAP等模块配置,带你熟悉运行的autosar代码,包括MICROSAR的启动运行,使用GreenHills生成运行的hex。

weixin_42412049的博客 1万+

Flink Table API 和 Flink SQL

1. 简单介绍 1.1 什么是 Table API 和 Flink SQL Flink本身是批流统一的处理框架,所以Table API和SQL,就是批流统一的上层处理API。 目前功能尚未完善,处于活跃的开发阶段。 Table API是一套内嵌在Java和Scala语言中的查询API,它允许我们以非常直观的方式,组合来自一些关系运算符的查询(比如select、filter和join)。而对于Flink SQL,就是直接可以在代码中写SQL,来实现一些查询(Query)操作。Flink的SQL支持,基于实现了

pageniao的博客 933

STM32串口编程基础知识讲解

本篇文章给大家介绍一下串口的基础编程知识,这些知识是属于串口的理论知识,在开始学习编写代码的时候必须要掌握这些基本的知识点。本篇文章讲解了串口的基本概念知识,大家在学习编写代码时将其掌握才能更好的理解代码。

m0_49476241的博客 1207

Flink Table API和Flink SQL

简介 Flink Table API 是一套内嵌在java和scala中的查询api,他允许以非常直观的方式组合一些关系运算符的查询。 Flink SQL是基于实现了SQL标准的Apache Calcite。 目前Flink Table API和SQL还不是很完善。 例子: package com.ts.tabletest; import com.ts.flink.SensorReading; import org.apache.flink.streaming.api.datastream.DataSt

寒暄的博客 1102

最新腾讯手游游戏appid列表及urlScheme一览 urlscheme查询

[全网独家] 2024最新腾讯游戏appid列表及urlScheme一览 手游包含王者荣耀QQ飞车我的世界PUBG吃鸡和平精英金铲铲之战三角洲行动QQ炫舞拳皇98OL欢乐斗地主 元梦之星使命召唤等

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2万+

上线之前多一道闸:业务审核系统的接入定义、双轨状态机与可靠生效闭环

运营后台“保存即生效”,让价格、库存、人群等配置每次修改都相当于一次无评审的上线。本文以至尊会员降价活动为例,系统拆解业务审核系统:用带业务语义的操作编码、规则化审核人与候选人快照、完整的生效回调契约做好接入定义;把业务改造为提交待生效,以不可变快照、字段级差异和唯一约束加幂等号防误配防重复;用审批轨与执行轨双轨状态机、链路式重新提交和以事件为准的审核链路理清状态;最后以发件箱、幂等键、超时先查后试、乐观锁与对账闭合生效环节,并结合两个可运行的Java程序,给出五种生效策略的事故率实测对比。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 6万+

Flink Table API与SQL技术详解

标量函数(Scalar Function):如 ABS (), SUBSTRING (), CURRENT_TIMESTAMP ()聚合函数(Aggregate Function):如 SUM (), COUNT (), HAVING ()表值函数(Table Valued Function):如 CROSS JOIN LATERAL TABLE ()

猫猫头 1776

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Flink的Table API 与SQL介绍及调用

1 概述    DataSetAPI和DateStreamAPI是基于整个Flink的运行时环境做操作处理的,Table API和SQL是在DateStreamAPI上又包了一层。对于新版本的Blink在DateStream基础上又包了一层实现了批流统一,上层执行环境都是基于流处理,做批流统一的查询。Table API是流处理和批处理通用的关系型API,与常规SQL语言中将查询指定为字符串不同,Table API查询是以Java或Scala中的语言嵌入样式来定义。 是一套内嵌在 Java 和 Scala 语

fighting 3393

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Flink Table API与SQL流数据处理实战

这段代码展示了如何使用Apache Flink的Table API和SQL处理流数据。首先,通过StreamExecutionEnvironment获取流处理环境,并从文件中读取数据流。接着,将数据流转换为SensorReading对象,并打印输出。然后,创建StreamTableEnvironment,将数据流转换为表,并使用Table API进行筛选操作。同时,通过SQL查询实现相同功能,并将结果转换回数据流输出。最后,启动流处理任务。代码还介绍了Flink的Table API和SQL的优势、流与表的转

渣渣盟的博客 3014

Flink实战(六) - Table API & SQL编程

1 意义 1.1 分层的 APIs & 抽象层次 Flink提供三层API。 每个API在简洁性和表达性之间提供不同的权衡,并针对不同的用例。 而且Flink提供不同级别的抽象来开发流/批处理应用程序 最低级抽象只提供有状态流。它通过Process Function嵌入到DataStream API中。它允许用户自由处理来自一个或多个流的事件,并使用一致的容错状态。此外,用户可以...

JavaEdge全是干货的技术号 5375
上一篇: Flink ProcessFunction
下一篇: Flink 时间特性及sql窗口
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力生活的黄先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值