Flink中的Lookup和Processing Time Temporal join有什么区别?

Dil*_*aba 4 apache-flink flink-streaming flink-sql

在我看来,Processing Time Temporal Join用于流和外部数据库,并且始终join根据连接条件获取外部数据库中的最新值。另外,Processing Time Temporal Jointhe external table is not feasible to materialize the table as a dynamic table within Flink.

类似地,Lookup Join用于流和外部数据库,并且始终是look up基于连接条件的外部数据库中的值。

Flink中会Lookup Join具体化外部数据库表吗?他们之间有什么区别?

Dav*_*son 7

处理时临时连接是两个流之间的连接,而查找连接是流与外部数据库之间的连接。

虽然 Flink 支持两种类型的事件时间临时连接,一种使用FOR SYSTEM_TIME AS OF语法,另一种使用时态表函数,但仅支持后一种基于表函数的方法来处理时间临时连接。

处理时间临时连接与表示仅附加动态表的两个流一起使用 - 例如,

SELECT
  o_amount, r_rate
FROM
  Orders,
  LATERAL TABLE (Rates(o_proctime))
WHERE
  r_currency = o_currency
Run Code Online (Sandbox Code Playgroud)

当使用处理时间属性执行此临时连接时(如上所示),每个传入订单将与费率表/流中的最新值连接。订单表/流根本不会具体化,而费率表/流将仅保留每种货币最近消耗的费率版本。

与事件时间临时连接不同,处理时间临时连接不提供确定性结果。

相比之下,查找联接针对查找源(例如 JDBC 数据库)执行查询。默认情况下,Flink 中不会具体化任何内容,但某些查找源(例如 JDBC)提供可选的缓存。

这些查找联接也不保证确定性结果,而是使用执行联接时可用的任何数据来执行联接,该数据来自缓存或查询。

时间连接和查找连接都不会更新其结果。您只需根据执行联接时运行时已知的信息获得尽力而为的结果。

为什么 Flink 费心提供处理时间临时连接?为什么不直接使用查找连接呢?两个原因:

  • 查找连接的成本更高——需要查询外部数据库并等待响应。是的,缓存是一种可能性,但随后您可能会加入过时的数据。通过处理时间临时连接,您可以确保使用自动更新的相当新鲜的数据。

  • 查找连接需要实现特殊的连接器。时间连接使用标准流连接器,因此它们更通用。

  • 看一下我刚刚添加到答案末尾的更新。至于文档,我很确定文档中该部分的第一部分是错误的——它是查找连接文档中一些句子的复制/粘贴,并且不能完全准确地反映处理时间时间连接的方式工作。 (2认同)