本文来自官网翻译: Joining

Window Join

窗口join 连接两个共享公共key 并位于同一窗口中的流的元素。可以使用窗口分配器定义这些窗口,两个流的元素都会触发。

然后将来自双方的元素传递给用户定义的 JoinFunction或者FlatJoinFunction,用户可以发出满足连接条件的结果。

一般用法可归纳如下:

stream.join(otherStream)
.where(<KeySelector>)
.equalTo(<KeySelector>)
.window(<WindowAssigner>)
.apply(<JoinFunction>)

关于语义的一些注释:

  • 两个流的元素的成对组合的表现像内连接,意味着如果它们没有来自要连接的另一个流的对应元素,则不会发出来当前流的元素。
  • 那些加入的元素将在其时间戳包含于相应窗口中的最大时间戳中。例如,[5, 10)具有其边界的窗口将导致连接的元素具有9作为其时间戳。

在下一节中,我们将使用一些示例性场景概述不同类型的窗口连接的行为。

Tumbling Window Join

当执行翻滚窗口join时,具有相同key和相同翻滚窗口的所有元素作为成对组合被连接并传递给JoinFunctionFlatJoinFunction。因为它的行为类似于内连接,所以一个流的元素在其翻滚窗口中没有来自另一个流的元素是不会发出的。

如图所示,我们定义了一个大小为2毫秒的翻滚窗口,这导致了窗体的窗口[0,1], [2,3], ... 图像显示了每个窗口中所有元素的成对组合,这些元素将被传递给JoinFunction。请注意,在翻滚窗口中[6,7]没有任何物体被发出,因为绿色流中不存在与橙色元素⑥和⑦连接的元素。

import org.apache.flink.streaming.api.windowing.assigners.SlidingEventTimeWindows;
import org.apache.flink.streaming.api.windowing.time.Time; ... val orangeStream: DataStream[Integer] = ...
val greenStream: DataStream[Integer] = ... orangeStream.join(greenStream)
.where(elem => /* select key */)
.equalTo(elem => /* select key */)
.window(TumblingEventTimeWindows.of(Time.milliseconds(2)))
.apply { (e1, e2) => e1 + "," + e2 }

Sliding Window Join

执行滑动窗口连接时,具有相同key和相同滑动窗口的所有元素将作为成对组合连接并传递给JoinFunctionFlatJoinFunction。当前滑动窗口中没有来自对应流的元素时,流元素不会发出!请注意,某些元素可能在一个滑动窗口中连接而在另一个滑块窗口中不连接。

在这个例子中,我们使用大小为2毫秒的滑动窗口并将它们滑动一毫秒,从而产生滑动窗口[-1, 0],[0,1],[1,2],[2,3], …。x轴下方的连接元素是传递给JoinFunction每个滑动窗口的元素。在这里,您还可以看到橙色②与窗口中的绿色③  在窗口[2,3]连接,但未与任何内容在窗口[1,2] 连接

import org.apache.flink.streaming.api.windowing.assigners.SlidingEventTimeWindows;
import org.apache.flink.streaming.api.windowing.time.Time; ... val orangeStream: DataStream[Integer] = ...
val greenStream: DataStream[Integer] = ... orangeStream.join(greenStream)
.where(elem => /* select key */)
.equalTo(elem => /* select key */)
.window(SlidingEventTimeWindows.of(Time.milliseconds(2) /* size */, Time.milliseconds(1) /* slide */))
.apply { (e1, e2) => e1 + "," + e2 }

Session Window Join

在执行会话窗口连接时,具有相同键的所有元素“组合”满足会话条件时以成对组合方式连接并传递给JoinFunctionFlatJoinFunction。同样,这会执行内连接,因此如果存在仅包含来自一个流的元素的会话窗口,则不会发出任何输出!

这里我们定义一个会话窗口连接,其中每个会话除以至少1ms的间隙。有三个会话,在前两个会话中,两个流的连接元素都传递给JoinFunction。在第三阶段,绿色流中没有元素,所以⑧和⑨没有连接!

import org.apache.flink.streaming.api.windowing.assigners.EventTimeSessionWindows;
import org.apache.flink.streaming.api.windowing.time.Time; ... val orangeStream: DataStream[Integer] = ...
val greenStream: DataStream[Integer] = ... orangeStream.join(greenStream)
.where(elem => /* select key */)
.equalTo(elem => /* select key */)
.window(EventTimeSessionWindows.withGap(Time.milliseconds(1)))
.apply { (e1, e2) => e1 + "," + e2 }

Interval Join

(时间)间隔连接使用公共密钥连接两个流的元素(我们现在称它们为A和B),并且流B的元素具有时间戳,该时间戳位于流A中元素的时间戳的相对时间间隔中。

这也可以更正式地表达为

b.timestamp ∈ [a.timestamp + lowerBound; a.timestamp + upperBound]

a.timestamp + lowerBound <= b.timestamp <= a.timestamp + upperBound

其中a和b是共享相同key 的A和B的元素。只要下限总是小于或等于上限,下限和上限都可以是负数或正数。间隔连接当前仅支持内连接。

当一对元素传递给ProcessJoinFunction它们时,它们将被赋予ProcessJoinFunction.Context两个元素较大的时间戳(可以通过它访问)。

注意:时间间隔连接当前仅支持事件时间。

在上面的例子中,我们连接两个流'orange'和'green',下限为-2毫秒,上限为+1毫秒。缺省情况下,这些界限是包容性的(包含上下界),方法lowerBoundExclusive()和upperBoundExclusive可以改变应用行为。

再次使用更正式的符号,这将转化为

orangeElem.ts + lowerBound <= greenElem.ts <= orangeElem.ts + upperBound

如上图三角形所示。

import org.apache.flink.streaming.api.functions.co.ProcessJoinFunction;
import org.apache.flink.streaming.api.windowing.time.Time; ... val orangeStream: DataStream[Integer] = ...
val greenStream: DataStream[Integer] = ... orangeStream
.keyBy(elem => /* select key */)
.intervalJoin(greenStream.keyBy(elem => /* select key */))
.between(Time.milliseconds(-2), Time.milliseconds(1))
.process(new ProcessJoinFunction[Integer, Integer, String] {
override def processElement(left: Integer, right: Integer, ctx: ProcessJoinFunction[Integer, Integer, String]#Context, out: Collector[String]): Unit = {
out.collect(left + "," + right);
}
});
});

【翻译】Flink Joining的更多相关文章

  1. 【翻译】Flink Table Api & SQL — 流概念

    本文翻译自官网:Streaming Concepts  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/st ...

  2. Flink Table Api & SQL 翻译目录

    Flink 官网 Table Api & SQL  相关文档的翻译终于完成,这里整理一个安装官网目录顺序一样的目录 [翻译]Flink Table Api & SQL —— Overv ...

  3. 【翻译】Flink Table Api & SQL — 性能调优 — 流式聚合

    本文翻译自官网:Streaming Aggregation  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table ...

  4. 【翻译】Flink Table Api & SQL — 配置

    本文翻译自官网:Configuration https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/config.h ...

  5. 【翻译】Flink Table Api & SQL — Hive —— 在 scala shell 中使用 Hive 连接器

    本文翻译自官网:Use Hive connector in scala shell  https://ci.apache.org/projects/flink/flink-docs-release-1 ...

  6. 【翻译】Flink Table Api & SQL — Hive —— Hive 函数

    本文翻译自官网:Hive Functions  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/hive/h ...

  7. 【翻译】Flink Table Api & SQL — SQL客户端Beta 版

    本文翻译自官网:SQL Client Beta  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/sqlCl ...

  8. 【翻译】Flink Table Api & SQL — Hive —— 读写 Hive 表

    本文翻译自官网:Reading & Writing Hive Tables  https://ci.apache.org/projects/flink/flink-docs-release-1 ...

  9. 【翻译】Flink Table Api & SQL —— Overview

    本文翻译自官网:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/ Flink Table Api & ...

随机推荐

  1. 《了解python》

    编程语言的发展史: 1.机器语言 站在计算机角度,直接用二进制跟计算机直接沟通,直接操控硬件 优点:计算机能够直接读懂,运行速度快 缺点:开发效率低 2.汇编语言 站在计算机角度,用简单的英文标签标识 ...

  2. STAF Trust Level 4 required for FS copy request

    C#中使用STAF从本机传输文件到远程的电脑,出现如下错误: 解决方法: 修改service.ini文件,添加信任IP段,并将trust level 设置为5,修改后文件内容如下 trace enab ...

  3. 2019 icpc 徐州 解题报告

    A.Cat 题库链接 给定区间[l,r],求一个最长子区间,使得区间异或和小于等于s,(结论)偶数和偶数后三个数的异或和等于0 #include <bits/stdc++.h> using ...

  4. LibreOJ #108. 多项式乘法

    二次联通门 : LibreOJ #108. 多项式乘法 /* LibreOJ #108. 多项式乘法 FFT板子题 不行啊...跑的还是慢 应该找个机会学一学由乃dalao的fft 或者是毛爷爷的ff ...

  5. LArea插件选中城市,确定之后又很难再次选择城市?

    加上fastclick.js这个js就能解决这个问题啦...... 详情:http://blog.csdn.net/zfy865628361/article/details/49512095

  6. Chrome 浏览器中查看 webSocket 连接信息

      1.以下代码实现一个webSocket连接,在文本输入框中输入内容,点击发送,通过服务器,返回相同的内容显示在下方. 1 <!DOCTYPE html> 2 <html lang ...

  7. CFD计算过程发散诸多原因分析【转载】

    转载自: http://blog.sina.com.cn/s/blog_5fdfa7e601010rkx.html 今天探讨引起CFD计算过程中发散的一些原因.cfd计算是将描述物理问题的偏微分方程转 ...

  8. boosting与随机森林

      本文原创,转载请注明出处 http://www.cnblogs.com/gufeiyang 本文主要分两部分,boosting 与 随机森林. “三个臭皮匠顶一个诸葛亮”是说三个不聪明的人集合在一 ...

  9. snprintf用错了快10年…

    int snprintf(char *str, size_t size, const char *format, ...); 从用snprintf开始,size参数一直传的都是buff_size-1, ...

  10. Java初级黄金体验 其二

    Java初级黄金体验 其二 引言:让我们看一下你的C盘有多少个文件和文件夹 初级 Java IO : 第一个纪念碑 小程序大致功能 让我们看一下E盘有多少个文件 上代码 最近太多的作业 代码可以无限改 ...