Foundry Magritte 附加摄取如何处理数据源中已删除的行?
How does Foundry Magritte append ingestion handle deleted rows in the data source?
如果我有一个设置为追加的 Magritte 摄取,它会检测源数据中的行是否被删除了吗?它还会删除摄取数据集中的行吗?
如果这是 file-based 摄取(与 JDBC 相反),则 magritte 摄取对文件而非行进行操作。如果您的摄取事务类型设置为更新,并且您对文件进行了更改,包括删除行,那么当摄取运行时,新文件将完全替换该数据集中的现有文件,因此对该文件所做的任何更改都将反映在数据集中。
两个补充说明:
- 如果您有排除文件已同步过滤器,您可能希望启用上次修改日期 and/or 文件大小选项,否则将不会摄取修改后的文件。
- 如果您的事务类型设置为 APPEND 而不是 UPDATE,则摄取将失败,因为 APPEND 不允许更改现有文件。
关于是否检测到删除的第一个问题,这将取决于您从中提取的数据库实现(对于此答案,我假设这是 JDBC)。如果这显示为修改并因此显示为新行,那么是的,您的删除将显示。
起初看起来像下面这样:
| primary_key | val | update_type | update_ts |
|-------------|-----|-------------|-----------|
| key_1 | 1 | CREATE | 0 |
| key_2 | 2 | CREATE | 0 |
| key_3 | 3 | CREATE | 0 |
随后进行一些更新(在后续 运行 内,增量 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 |
在此之后,您将能够检测到已删除的记录并进行相应的调整。您的完整物化 table 视图现在如下所示:
| 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
输出删除它们(除非你正在做 lower-level 文件操作,你可能会删除底层文件)。
值得注意的是,您需要尽可能晚地实现 DELETES
(假设您的中间逻辑允许),因为这将需要一个快照并会破坏您的整体管道性能。
如果您不处理 JDBC,那么@Kellen 的回答将适用。
如果我有一个设置为追加的 Magritte 摄取,它会检测源数据中的行是否被删除了吗?它还会删除摄取数据集中的行吗?
如果这是 file-based 摄取(与 JDBC 相反),则 magritte 摄取对文件而非行进行操作。如果您的摄取事务类型设置为更新,并且您对文件进行了更改,包括删除行,那么当摄取运行时,新文件将完全替换该数据集中的现有文件,因此对该文件所做的任何更改都将反映在数据集中。
两个补充说明:
- 如果您有排除文件已同步过滤器,您可能希望启用上次修改日期 and/or 文件大小选项,否则将不会摄取修改后的文件。
- 如果您的事务类型设置为 APPEND 而不是 UPDATE,则摄取将失败,因为 APPEND 不允许更改现有文件。
关于是否检测到删除的第一个问题,这将取决于您从中提取的数据库实现(对于此答案,我假设这是 JDBC)。如果这显示为修改并因此显示为新行,那么是的,您的删除将显示。
起初看起来像下面这样:
| primary_key | val | update_type | update_ts |
|-------------|-----|-------------|-----------|
| key_1 | 1 | CREATE | 0 |
| key_2 | 2 | CREATE | 0 |
| key_3 | 3 | CREATE | 0 |
随后进行一些更新(在后续 运行 内,增量 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 |
在此之后,您将能够检测到已删除的记录并进行相应的调整。您的完整物化 table 视图现在如下所示:
| 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
输出删除它们(除非你正在做 lower-level 文件操作,你可能会删除底层文件)。
值得注意的是,您需要尽可能晚地实现 DELETES
(假设您的中间逻辑允许),因为这将需要一个快照并会破坏您的整体管道性能。
如果您不处理 JDBC,那么@Kellen 的回答将适用。