链接的资源描述了两种不同的场景。
- 博客文章讨论了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)
Table
user
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
外部系统,例如数据库或键值存储。