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

What is the difference between Lookup and Processing Time Temporal join in Flink?

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

时使用 Processing Time Temporal Join

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

Flink会Lookup Join实现外部数据库table吗?它们有什么区别?

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

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

处理时间时间连接与表示 append-only 动态 tables 的两个流一起工作——例如,

SELECT
  o_amount, r_rate
FROM
  Orders,
  LATERAL TABLE (Rates(o_proctime))
WHERE
  r_currency = o_currency

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

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

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

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

临时连接和查找连接都不会更新它们的结果。您只会根据执行连接时运行时已知的内容获得 best-effort 结果。

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

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

  • 查找联接需要实施特殊的连接器。临时连接使用标准的流连接器,因此它们更普遍可用。