链接的资源描述了两种不同的场景。
- 博客文章讨论了upsert
DataStream -> Table转换。
- 该文档描述了反向 upsert
Table -> DataStream转换。
以下讨论基于 Flink 1.4.0(2018 年 1 月)。
插入DataStream -> Table转换
通过对键的 upsert将 a 转换DataStream为 aTable不是本机支持的,而是在路线图上。同时,您可以使用附加Table和具有用户定义聚合函数的查询来模拟此行为。
如果您有一个跟踪用户登录Table Logins的架构的追加,您可以将其转换为使用以下查询键入的 upsert:(user, loginTime, ip)Tableuser
SELECT user, LAST_VAL(loginTime), LAST_VAL(ip) FROM Logins GROUP BY user
LAST_VAL聚合函数是用户自定义的聚合函数,总是返回最新的附加值。
尽管提供了更简洁的 API,但对 upsert 转换的本机支持DataStream -> Table基本上以相同的方式工作。
插入Table -> DataStream转换
不支持将 aTable转换为 upsert 。DataStream这也正确反映在文档中:
请注意,将动态表转换为 DataStream 时仅支持追加和收回流。
我们故意选择不支持 upsertTable -> DataStream转换,因为DataStream只有知道关键属性时才能处理 upsert。这些取决于查询,并不总是很容易识别。开发人员有责任确保正确解释关键属性。不这样做会导致错误的程序。为避免出现问题,我们决定不提供 upsertTable -> DataStream转换。
相反,用户可以将 aTable转换为 retraction DataStream。此外,我们支持UpsertTableSink将 upsert 写入DataStream外部系统,例如数据库或键值存储。