Apache Flink API

一、Apache Flink API

Flink 提供了不同级别的抽象来开发流 / 批处理应用程序。在这里插入图片描述

二、SQL:

Flink 提供的最高级别的抽象是 SQL。这种抽象在语义和表达方式上均类似于 Table API,但是将程序表示为 SQL 查询表达式。在 SQL 抽象与 Table API SQL 查询紧密地相互作用,并且可以在中定义的表执行 Table API

查询

SQL

三、Table API:

Table API 是 Flink 的语言嵌入式关系 API,用于在 Java 或 Scala 中编写类 SQL 的查询,这些查询会自动进行优化。Table API 查询可以使用一致的语法和语义同时在批处理或流数据上运行。

Table API 支持非常多的 Operations(操作)

From:与 SQL 查询中的 FROM 子句相似。扫描已注册的表。适用于批处理和流。

Table orders = tableEnv.from("Orders");

Select:类似于 SQL SELECT 语句。执行选择操作。适用于批处理和流。

Table orders = tableEnv.from("Orders");
Table result = orders.select("a, c as d");

As:重命名字段。适用于批处理和流。

Table orders = tableEnv.from("Orders");
Table result = orders.as("x, y, z, t");

Where / Filter: 类似于 SQL WHERE 子句。筛选出未通过筛选谓词的行。适用于批处理和流。

Table orders = tableEnv.from("Orders");
Table result = orders.where("b === 'red'");

AddColumns: 执行字段添加操作。如果添加的字段已经存在,它将引发异常。适用于批处理和流。

Table orders = tableEnv.from("Orders");
Table result = orders.addColumns("concat(c, 'sunny')");

DropColumns: 执行字段删除操作。字段表达式应该是字段引用表达式,并且只能删除现有字段。适用于批处理和流。

Table orders = tableEnv.from("Orders");
Table result = orders.dropColumns("b, c");

RenameColumns: 执行字段重命名操作。字段表达式应该是别名表达式,并且只有现有字段可以重命名。适用于批处理和流。

Table orders = tableEnv.from("Orders");
Table result = orders.renameColumns("b as b2, c as c2");

GroupBy Aggregation: 类似于 SQL GROUP BY 子句。使用以下正在运行的聚合运算符将分组键上的行分组,以逐行聚合行。适用于批处理和流。

Table orders = tableEnv.from("Orders");
Table result = orders.groupBy("a").select("a, b.sum as d");

Inner Join: 类似于 SQL JOIN 子句。连接两个表。两个表必须具有不同的字段名称,并且至少一个相等的联接谓词必须通过联接运算符或使用 where 或 filter 运算符进行定义。适用于批处理和流。

Table left = tableEnv.fromDataSet(ds1, "a, b, c");
Table right = tableEnv.fromDataSet(ds2, "d, e, f");
Table result = left.join(right).where("a = d").select("a, b, e");

Outer Join: 类似于 SQL LEFT / RIGHT / FULL OUTER JOIN 子句。连接两个表。两个表必须具有不同的字段名称,并且必须至少定义一个相等联接谓词。适用于批处理和流。

Table left = tableEnv.fromDataSet(ds1, "a, b, c");
Table right = tableEnv.fromDataSet(ds2, "d, e, f");

Table leftOuterResult = left.leftOuterJoin(right, "a = d").select("a, b, e");
Table rightOuterResult = left.rightOuterJoin(right, "a = d").select("a, b, e");
Table fullOuterResult = left.fullOuterJoin(right, "a = d").select("a, b, e");

四、DataStream/DataSet API:

处理有界数据集,对数据集进行转换(例如,过滤,映射,联接,分组)。最初从某些来源(例如,通过读取文件或从本地集合)创建数据集。结果通过接收器返回,接收器可以例如将数据写入(分布式)文件或标准输出(例如命令行终端)。
DataStream API 是 Flink 的主要抽象,用于通过 Java 或 Scala 实现具有复杂时间语义的有状态数据流处理的应用程序。

1、DataSet API(Transformations(转换)、Data Sources(数据源)、Data Sinks(数据接收器))

Transformations(转换):
Map:取一个元素并产生一个元素。

data.map(new MapFunction<String, Integer>() {
  public Integer map(String value) { return Integer.parseInt(value); }
});

FlatMap:取一个元素并产生零个,一个或多个元素。

data.flatMap(new FlatMapFunction<String, String>() {
  public void flatMap(String value, Collector<String> out) {
    for (String s : value.split(" ")) {
      out.collect(s);
    }
  }
});

Filter: 为每个元素评估一个布尔函数,并保留该函数返回 true 的布尔函数。

data.filter(new FilterFunction<Integer>() {
  public boolean filter(Integer value) { return value > 1000; }
});

Reduce: 通过将两个元素重复组合为一个元素,将一组元素组合为一个元素。Reduce 可以应用于完整的数据集或分组的数据集。

data.reduce(new ReduceFunction<Integer> {
  public Integer reduce(Integer a, Integer b) { return a + b; }
});

Aggregate: 将一组值汇总为一个值。可以将聚合功能视为内置的归约功能。汇总可以应用于完整的数据集,也可以应用于分组的数据集。

Dataset<Tuple3<Integer, String, Double>> input = // [...]
DataSet<Tuple3<Integer, String, Double>> output = input.aggregate(SUM, 0).and(MIN, 2);

2、DataStream API (Transformations(转换)、Data Sources(数据源)、Data Sinks(数据接收器))

Transformations(转换)
Map:取一个元素并产生一个元素。下面的例子是通过一个映射函数,将输入流的值加倍。

DataStream<Integer> dataStream = //...
dataStream.map(new MapFunction<Integer, Integer>() {
    @Override
    public Integer map(Integer value) throws Exception {
        return 2 * value;
    }
});

FlatMap:取一个元素并产生零个,一个或多个元素。FlatMap 功能可将句子拆分为单词:

dataStream.flatMap(new FlatMapFunction<String, String>() {
    @Override
    public void flatMap(String value, Collector<String> out)
        throws Exception {
        for(String word: value.split(" ")){
            out.collect(word);
        }
    }
});

Filter: 为每个元素评估一个布尔函数,并保留该函数返回 true 的布尔函数。筛选出零值的筛选器:

dataStream.filter(new FilterFunction<Integer>() {
    @Override
    public boolean filter(Integer value) throws Exception {
        return value != 0;
    }
});

Reduce: 对键控数据流进行 “滚动” 压缩。将当前元素与最后一个减小的值合并,并发出新值。reduce 函数创建部分和流:

keyedStream.reduce(new ReduceFunction<Integer>() {
    @Override
    public Integer reduce(Integer value1, Integer value2)
    throws Exception {
        return value1 + value2;
    }
});

Aggregate: 在键控数据流上滚动聚合。min 和 minBy 之间的区别是 min 返回最小值,而 minBy 返回在此字段中具有最小值的元素(与 max 和 maxBy 相同)。

keyedStream.sum(0);
keyedStream.sum("key");
keyedStream.min(0);
keyedStream.min("key");
keyedStream.max(0);
keyedStream.max("key");
keyedStream.minBy(0);
keyedStream.minBy("key");
keyedStream.maxBy(0);
keyedStream.maxBy("key");

Window:可以在已分区的 KeyedStreams 上定义 Windows。Windows 根据某些特征将每个键中的数据分组(例如,最近 5 秒钟内到达的数据)。

dataStream.keyBy(0).window(TumblingEventTimeWindows.of(Time.seconds(5))); // Last 5 seconds of data

Window Join:在给定键和一个公共窗口上连接两个数据流。

dataStream.join(otherStream)
    .where(<key selector>).equalTo(<key selector>)
    .window(TumblingEventTimeWindows.of(Time.seconds(3)))
    .apply (new JoinFunction () {...});

Aggregations on windows:聚合窗口的内容。min 和 minBy 之间的区别是 min 返回最小值,而 minBy 返回在此字段中具有最小值的元素(与 max 和 maxBy 相同)。

windowedStream.sum(0);
windowedStream.sum("key");
windowedStream.min(0);
windowedStream.min("key");
windowedStream.max(0);
windowedStream.max("key");
windowedStream.minBy(0);
windowedStream.minBy("key");
windowedStream.maxBy(0);
windowedStream.maxBy("key");

3、Data Sources(数据源)

基于文件:

readTextFile(path)/ TextInputFormat- 逐行读取文件,并将其作为字符串返回。
readTextFileWithValue(path)/ TextValueInputFormat- 逐行读取文件,并将它们作为 StringValues 返回。StringValue 是可变的字符串。
readCsvFile(path)/ CsvInputFormat- 解析以逗号(或其他字符)分隔的字段的文件。返回元组或 POJO 的数据集。支持基本的 Java 类型及其与 Value 相对应的字段类型。
readFileOfPrimitives(path, Class)/ PrimitiveInputFormat- 解析以换行符(或其他 char 序列)分隔的原始数据类型的文件,例如 String 或 Integer。
readFileOfPrimitives(path, delimiter, Class)/ PrimitiveInputFormat- 解析以换行符(或其他 char 序列)分隔的原始数据类型的文件,例如 String 或 Integer 使用给定的分隔符。
readFile(fileInputFormat, path) - 根据指定的文件输入格式读取(一次)文件。
readFile(fileInputFormat, path, watchType, interval, pathFilter, typeInfo)- 这是前两个内部调用的方法。它 path 根据给定的读取文件 fileInputFormat。根据提供的内容 watchType,此源可以定期(每 intervalms)监视路径中的新数据(FileProcessingMode.PROCESS_CONTINUOUSLY),或者处理一次当前路径中的数据并退出(FileProcessingMode.PROCESS_ONCE)。使用 pathFilter,用户可以进一步从文件中排除文件。

基于套接字:

socketTextStream- 从套接字读取。元素可以由定界符分隔。

基于集合:

fromCollection(Collection)- 从 Java.util.Collection 创建数据集。集合中的所有元素必须具有相同的类型。
fromCollection(Iterator, Class)- 从迭代器创建数据集。该类指定迭代器返回的元素的数据类型。
fromElements(T ...)- 从给定的对象序列创建数据集。所有对象必须具有相同的类型。
fromParallelCollection(SplittableIterator, Class)- 从迭代器并行创建数据集。该类指定迭代器返回的元素的数据类型。
generateSequence(from, to) - 并行生成给定间隔中的数字序列。

通用:

readFile(inputFormat, path)/ FileInputFormat- 接受文件输入格式。
createInput(inputFormat)/ InputFormat- 接受通用输入格式。

4、Data Sinks(数据接收器)

writeAsText()/ TextOutputFormat- 将元素按行写为字符串。通过调用每个元素的 * toString()* 方法获得字符串。
writeAsFormattedText()/ TextOutputFormat- 将元素按行写为字符串。通过为每个元素调用用户定义的 * format()* 方法来获取字符串。
writeAsCsv(...)/ CsvOutputFormat- 将元组写为逗号分隔的值文件。行和字段定界符是可配置的。每个字段的值来自对象的 * toString()* 方法。
print()/ printToErr() - 在标准输出 / 标准错误流上打印每个元素的 toString()值。可选地,可以提供前缀(msg),该前缀在输出之前。这可以帮助区分不同的打印调用。如果并行度大于 1,则输出之前还将带有产生输出的任务的标识符。
writeUsingOutputFormat()/ FileOutputFormat- 的方法和自定义文件输出基类。支持自定义对象到字节的转换。
writeToSocket - 根据一个元素将元素写入套接字 SerializationSchema
addSink- 调用自定义接收器功能。Flink 捆绑有与其他系统(例如 Apache Kafka)的连接器,这些连接器已实现为接收器功能。
write()/ FileOutputFormat- 的方法和自定义文件输出基类。支持自定义对象到字节的转换。
output()/ OutputFormat- 最通用的输出方法,用于不基于文件的数据接收器(例如将结果存储在数据库中)。

五、Stateful Stream Processing:

通过 Process Function 嵌入到 DataStream API 中。它允许用户自由地处理一个或多个流中的事件,并使用一致的容错状态。此外,用户可以注册事件时间和处理时间回调,从而允许程序实现复杂的计算。

参考:RangeYan
参考:API

第一章 整体介绍 2 1.1 什么是 Table APIFlink 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、付费专栏及课程。

余额充值