【问题标题】:Delta Lake: don't we need time partition for full reprocessed tables anymoreDelta Lake:我们不再需要时间分区来处理完整的重新处理表了吗
【发布时间】:2020-12-05 06:58:03
【问题描述】:

目标

假设您在 ETL 的帮助下构建数据湖和星型模式。存储格式为 Delta Lake。 ETL 的职责之一是构建渐变维度 (SCD) 表(累积状态)。这意味着,对于每个 SCD 表,ETL 每天都会读取整个表的状态,应用更新并将它们保存回来(完全覆盖)。

问题

我们在团队中争论的一个问题是:我们是否应该向 SCD(完全覆盖)表添加时间分区?意思是,我应该将最新的(完整)表状态保存到SOME_DIMENSION/ 还是SOME_DIMENSION/YEAR=2020/MONTH=12/DAY=04/

注意事项

一方面,Delta Lake 具有所有必需的功能:时间旅行和 ACID。当它覆盖整个表时,会发生逻辑删除,您仍然可以查询旧版本并回滚到它们。所以Delta Lake几乎为你管理时间分区,代码变得更简单了。

另一方面,我说“几乎”是因为恕我直言,时间旅行和 ACID 并未涵盖 100% 的用例。它没有到达时间的概念。例如:

示例(需要时间分区时)

BA 团队报告SOME_FACT/YEAR=2019/MONTH=07/DAY=15 数据损坏(事实必须以时间分区存储,因为数据是按到达时间处理的)。为了在 DEV/TEST 环境中重现问题,您需要 1 个事实表原始输入和 10 个 SCD 表。

有了事实,一切都很简单,因为您在 Data Lake 中有原始输入。但是对于增量状态(SCD 表),事情变得复杂 - 如何在处理 SOME_FACT/YEAR=2019/MONTH=07/DAY=15 的时间点获取 10 个 SCD 表的状态?如何自动执行此操作?

更复杂的是,您的环境可能会出现大量错误修复和历史重新处理。意味着 2019-07 数据可能会在 2020 年的某个地方重新处理。Delta Lake 允许您仅根据处理或版本号进行回滚。所以你实际上不知道你应该使用哪个版本。

另一方面,使用日期分区,您始终可以确定 SOME_FACT/YEAR=2019/MONTH=07/DAY=15 是在 SOME_DIMENSION/YEAR=2019/MONTH=07/DAY=15 上计算得出的。

【问题讨论】:

    标签: apache-spark architecture etl delta-lake data-lake


    【解决方案1】:

    视情况而定,我认为这有点复杂。

    首先需要一些上下文 - Delta 为您提供的时间旅行仅限于当前的提交历史,默认情况下为 30 天。如果您正在进行优化,则该时间可能会大大缩短(默认为 7 天)。 此外,您实际上可以查询特定时间的 Delta 表,不仅是版本,而且由于上述限制(除非您愿意支付存储非常长的提交历史的性能和财务成本),从长远来看它没有用处.

    这就是为什么现在一个非常常见的数据湖架构是奖章表方法(青铜->白银->黄金)。理想情况下,我想将原始输入存储在“青铜”层中,在银层中有一个完整的历史视角(已经干净、经过验证、最好的事实来源,但需要完整的历史),并消耗当前直接来自“黄金”表的版本。

    这将避免由于额外的分区而增加查询 SCD 的复杂性,同时让您可以在需要时选择“返回”到银层。但这始终是一个权衡决定——无论如何,不​​要依赖 Delta 进行长期版本控制。

    【讨论】:

    • 首先,感谢您的回答。你的意思是“银”区将有SOME_DIMENSION/YEAR=2019/MONTH=07/DAY=15/<files>分区方法,而“金”只有SOME_DIMENSION/<files>下的最新分区?我认为只有在 Delta Lake 表上拥有 Lakehouse 架构和用户自助服务时才有意义。您仍然可以在所有 ETL 逻辑发生的“银色”区域查询 SCD 的所有复杂性。此优惠仅适用于“黄金”区(企业)用户。 ETL 根本不会读取“Golden”。就我而言,我在数据仓库有“黄金”层
    • 你也可以按时间查询Delta,但那是处理时间。虽然表按到达时间分区:SOME_DIMENSION/YEAR=2019/MONTH=07/DAY=15/<files>。由于重新处理,这两次可能不相关
    • 某一刻,分区是指将多个Delta表按时间结构存储在不同的文件夹下吗?
    • 一个增量表,但每个分区将包含数据的完整副本。一张表让元数据管理更轻松。
    • 好的,所以是和否 - 我想要 DW 中的最新视图,“银”区域中的整个历史记录,但不一定是每个分区格式的完整副本,因为这可能会在以后引入问题系统增长和处理更频繁地完成。理想情况下,我们可以在表中拥有所有数据版本,但前提是它实际上在到达之间发生了变化,并且具有最能支持大多数常见查询的分区(可能首先通过“isActive”开关之类的东西)。
    猜你喜欢
    • 2012-02-02
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多