【问题标题】:Table without date and Primary Key没有日期和主键的表
【发布时间】:2020-12-01 10:16:54
【问题描述】:

我有 900 万条记录。我们需要做以下操作:-

我们每天都会收到 9M 条记录和 150GB 文件大小的整个文件

它被截断并加载到雪花中。每天删除整个9B记录并加载

我们只想将增量文件加载发送到 Snowflake。意思是:

例如,在 900 万条记录中,我们只会更新 050 万条记录(0.1 万条插入、0.3 条删除和 0.2 条更新)。我们将如何比较文件并仅提取增量文件并加载到雪花。如何在 AWS 原生工具中以经济高效且快速的方式执行此操作并加载到 S3。

P.s 数据没有任何日期列。这是 2012 年写的一个相当古老的概念。我们需要对此进行优化。文件格式为固定宽度。附加示例 RAW 数据。

Sample Data:
https://paste.ubuntu.com/p/dPpDx7VZ5g/

简而言之,我只想将插入、更新和删除提取到文件中。您如何对这种最佳且最具成本效益的方式进行分类。

【问题讨论】:

  • 您已将其标记为 Oracle、Teradata 和 DataStage,但您的问题似乎并未表明您正在使用这三个工具中的任何一个。您还为 SQL 标记了此内容,但不清楚如果您尝试比较两个不同平面文件中的数据,这听起来像是您正在做的那样,使用 SQL 是否有意义。

标签: sql oracle amazon-web-services teradata datastage


【解决方案1】:

您的标签和问题内容不匹配,但我猜您正在尝试将数据从 Oracle 加载到 Snowflake。您想从 Oracle 执行增量加载,但表中没有增量键来标识增量行。你有两个选择。

  1. 与您的数据所有者合作并努力确定增量密钥。必须有一个。人们有时懒得付出这种努力。这将是最佳选择
  2. 如果不能,请寻找金门之类的 CDC(变更数据捕获)解决方案

【讨论】:

    【解决方案2】:

    CDC 阶段默认出现在 DataStage 中。

    结合使用 CDC 阶段和 Transformer 阶段,是识别新行、更改行和删除行的最佳方法。

    【讨论】:

    • 我的表中没有唯一键。您可能已经看到问题中的数据。如果我没有主键列,我应该使用所有列吗?
    【解决方案3】:

    您需要识别使行唯一的列,不建议对所有列进行 CDC,如果您在 CDC 阶段添加更多更改列,则具有 CDC 阶段的 DataStage 作业会消耗更多资源。

    与您的 BA 一起确定使行在数据中唯一的列。

    【讨论】:

    • 如果必须使用所有列,要使行唯一,那么执行截断和加载是正确的选择。
    【解决方案4】:

    我遇到了类似的问题。就我而言,没有主键,也没有日期列来识别差异。所以我所做的实际上是,我使用 AWS Athena(presto 托管)来计算源和目标之间的差异。下面是过程:

    1. 将源数据复制到 s3。
    2. 在雅典娜中创建源表,指向从源复制的数据。
    3. 在雅典娜中创建指向目标数据的目标表。
    4. 现在使用 athena 中的 SQL 来找出区别。由于我没有主键和日期列,因此我使用了以下脚本:
    select * from table_destination
    except 
    select * from table_source;
    

    如果您有主键,您也可以使用它来查找差异并创建包含“更新/插入/删除”列的结果表

    此选项是 aws 原生的,然后它也会更便宜,因为它在 athena 中的每 TB 成本为 5 美元。此外,在这种方法中,不要忘记编写文件轮换脚本,以降低您的 s3 成本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-03
      • 2023-03-11
      • 1970-01-01
      • 2013-06-28
      • 2019-07-05
      • 2019-05-23
      • 2013-07-27
      • 1970-01-01
      相关资源
      最近更新 更多