0

每当定义一个连续导出实体时,它都会有一个查询作为其输入。如果查询只是一个表名,很容易理解导出是如何发生的。必须根据导出实体运行时的不同时间点来考虑表中记录的摄取时间。但是,如果查询是实际的“查询”,我的意思是说正在使用各种管道运算符在表顶部应用一些转换。在这种情况下,查询的结果是动态的,数据不会在任何地方被摄取。这是否意味着连续导出真的只考虑查询中最左侧实体的摄取时间,这显然是某个表,因此显然确实将摄取时间存储为它的记录的一部分。

更新

添加此更新,因为我需要对@yifat 的回答进行更多说明。

因此,假设我的查询引用了三个表 t1、t2、t3。我创建了下图来描述我的困惑:-

在此处输入图像描述

正如您在图中看到的那样,当前运行实例无论如何都将确保它将获取自上次导出游标以来所有 3 个表的数据。那么添加强制延迟有什么不同呢?该图将说明一些我没有正确理解的东西。谢谢。

4

1 回答 1

3

连续导出保存上次导出的数据库游标,并且每个连续导出作业仅考虑自该数据库游标以来摄取的记录。这适用于查询引用的所有表,无论查询包含多少和哪些运算符。因此,如果您的查询包含连接,建议将forcedLatency 选项设置为参与连接的表的最大预期延迟。

例如,假设查询内部连接表 T1 和表 T2 在键 K 上,并且您希望两个表中相同 K 的记录大约在同一时间到达。现在假设在时间 t0,使用密钥 K1 对 T1 进行了摄取,在时间 t2,使用密钥 K1 对 T2 进行了摄取,并且在时间 t1 之间连续导出运行。在这种情况下,导出将错过结果集中的 K1,因为 is 执行内部连接,而 T2 还没有 K1。下一个导出周期也不会包含此记录,因为它只会包含在 t1 之后摄取的记录,而 T1 中不包含 K1。强制延迟会在游标上施加一些延迟,以便仅包含早于 ForcedLatency 的记录。在此示例中,T1 中的记录将“等待”T2 中的记录。

如果导出查询包含单个表,则不需要强制延迟。如果您不希望所有表都被限定为数据库游标,您可以使用 'over' 参数来指定应考虑哪些表。如果您要加入维度表并希望每个查询都考虑所有记录,这将非常有用。

于 2019-05-03T12:19:16.453 回答