因此,我正在研究使用数据迁移服务 Chance Data Capture 可以实现什么,将数据从 MSSQL 获取到 S3 以及 Redshift。
Redshift 测试很好,如果我删除源数据库中的一条记录,一两秒后该记录就会从 Redshift 中消失。与插入/更新等相同..
但是S3...
您会从第一次满载中获得原始记录。
然后,如果您更新源中的记录,S3 会收到该记录的新副本,并标有“I”。
如果我删除一条记录,我会得到该记录的另一份标有“D”的副本。
所以我的问题是 - 我该如何处理这一切? 我如何查询我的 S3 存储桶以查看反映源数据库的数据集的“当前”状态?
我是否必须自己编写一些代码来获取所有这些文件并处理它们,执行插入/更新和删除,直到我最终解析回“正常”数据集?
欢迎任何见解!
包含“I”、“D”或“U”的记录实际上是CDC数据(变更数据捕获)。这有时被称为“历史”或“历史数据”。这种类型的数据在数据仓库中有一些应用,也可以在许多机器学习用例中使用。
现在进入下一点,为了获得数据集的“当前”状态,您必须自己编写脚本/代码。您可以使用 AWS Glue 来执行该任务。例如,这篇文章解释了类似的内容。
如果您不想维护粘合代码,那么快捷方式是不要直接将 s3 目标与 DMS 结合使用,而是使用 Redshift 目标,并在应用所有 CDC 后,使用 Redshift unload 命令将最终副本卸载到 S3。
如此处所解释,关于
'I'
、'U'
和'D'
的含义。
我们如何获取数据库的当前状态?另一种方法是首先将此附加列添加到完整加载文件中,即 CDC 之前的初始加载文件也应该具有此附加列。 如何? 现在在 athena 中查询数据,排除
Op
不在 ("D", "U")
或 AR_H_OPERATION NOT IN ("DELETE", "UPDATE")
中的记录。因此,您可以获得正确的计数(ONLY COUNT
,因为只有当该条目已经有 'U'
时,才会出现 I
)。
SELECT count(*) FROM "database"."table_name"
WHERE Op NOT IN ('D','U')
另外,要获取所有记录,您可以在 athena 中尝试使用复杂的 sql,其中
Op
不在 ('D')
中,并在 Op IN = 'I'
和计数 1 时记录,否则如果计数 2,则选择最新的一个或 Op = 'U'
.