4

如果我有一个设置为追加的 Magritte 摄取,它会检测是否在源数据中删除了行?它还会删除摄取数据集中的行吗?

4

2 回答 2

1

对于您是否检测到删除的第一个问题,这将取决于您从中提取的数据库实现(我假设这是 JDBC 的答案)。如果这显示为修改并因此显示为新行,那么是的,您的删除将显示。

起初看起来像下面这样:

| primary_key | val | update_type | update_ts |
|-------------|-----|-------------|-----------|
| key_1       | 1   | CREATE      | 0         |
| key_2       | 2   | CREATE      | 0         |
| key_3       | 3   | CREATE      | 0         |

随后是一些更新(在后续运行中,增量 on update_ts

| primary_key | val | update_type | update_ts |
|-------------|-----|-------------|-----------|
| key_1       | 1   | UPDATE      | 1         |
| key_2       | 2   | UPDATE      | 1         |

现在,您的数据库必须显式标记任何DELETE增加 update_ts 才能引入:

| primary_key | val | update_type | update_ts |
|-------------|-----|-------------|-----------|
| key_1       | 1   | DELETE      | 2         |

在此之后,您将能够检测到已删除的记录并进行相应的调整。您的完整物化表视图现在将如下所示:

| primary_key | val | update_type | update_ts |
|-------------|-----|-------------|-----------|
| key_1       | 1   | CREATE      | 0         |
| key_2       | 2   | CREATE      | 0         |
| key_3       | 3   | CREATE      | 0         |
| key_1       | 1   | UPDATE      | 1         |
| key_2       | 2   | UPDATE      | 1         |
| key_1       | 1   | DELETE      | 2         |

如果您在raw摄取过程中以增量方式运行,这些行不会自动从您的数据集中删除; 您必须明确编写逻辑来检测这些已删除的记录并将它们从您的输出clean步骤中删除。如果找到这些删除,您必须SNAPSHOT输出删除它们(除非您正在执行较低级别的文件操作,您可能会删除底层文件)。

值得注意的是,您需要DELETES尽可能晚地实现(假设您的中间逻辑允许),因为这将需要快照并且会破坏您的整体管道性能。

如果您不处理 JDBC,那么@Kellen 的答案将适用。

于 2020-11-05T19:54:31.690 回答
0

如果这是基于文件的摄取(与 JDBC 相对),则 magritte 摄取对文件而不是对行进行操作。如果您的摄取事务类型设置为 UPDATE,并且您对文件进行了更改,包括删除行,那么当摄取运行时,新文件将完全替换该数据集中的现有文件,因此对文件所做的任何更改都将反映在数据集中。

两个附加说明:

  1. 如果您有已同步的排除文件过滤器,您可能希望启用上次修改日期和/或文件大小选项,否则修改后的文件将不会被摄取。排除已同步的文件
  2. 如果您的事务类型设置为 APPEND 而不是 UPDATE,那么摄取将失败,因为 APPEND 不允许更改现有文件。
于 2020-11-05T19:50:05.830 回答