apache-spark - Delta Lake Medellion 分层架构,青铜层增量 ETL 最佳实践

标签 apache-spark databricks etl azure-data-lake delta-lake

在奖章层架构(铜牌、银牌和金牌)中,当执行增量 ETL(例如从源中提取最后 X 天的交易)时,最好按提取或交易日期对铜牌层进行分区吗? 我知道青铜层应该是增量格式的原始数据,但是从着陆区源合并到该层是最佳实践吗?或者按提取日期分区并始终附加。

在示例中,我看到源始终只是生成最新记录,但在我的例子中,我们使用滑动窗口 ETL,因此几天之间存在重复 - 这是因为我们有进入源的记录“迟到”,因此我们需要确保它们被考虑在内。因此,这不是一个仅仅能够附加到青铜并且不存在重叠的简单情况。

我正在考虑以下其中一项,这是最佳实践:

  1. 将源中的所有记录放入登陆区域(非增量、 Parquet 格式),并按登陆区域中的提取日期进行分区。合并到青铜级增量表中,按交易日期分区。
  2. 使用提取日期作为分区列附加到青铜增量表,因此青铜增量层将变得非常大(由于每天之间的重复记录)。
  3. 直接从按交易日期分区的源合并到青铜层(即跳过着陆区) - 我在这里唯一担心的是合并设置不正确并且我们丢失历史记录的可能性(可能是低值)风险?)

值得注意的是,这些数据是大数据,每天可能有数百万条记录。

最佳答案

将元数据列添加到青铜层非常好,而且通常是理想的选择!常见的元数据列有:

  • 文件名(如果从文件源创建)
  • 摄取时间戳
  • 摄取日期(通常用于分区)

它是青铜表的非元数据列,理想情况下是源数据从保存的任何格式到增量的 1:1 无损转换。这使得 future 的再处理更加高效,例如以防不良记录进入 Delta Lake Lakehouse,因为您不再需要重新解析登陆记录。

对于您的窗口函数,当数据使用 timestamp 元数据列移动到第一个白银层时,它可以应用于青铜层。

保留已登陆记录是一项业务决策,具体取决于您的监管需求以及添加存储与保留原始格式的原始记录的成本/ yield 。

可以找到一个很棒的博客,其中包含有关徽章架构的更多详细信息here .

关于apache-spark - Delta Lake Medellion 分层架构,青铜层增量 ETL 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75716349/

相关文章:

sql-server - 如何转换 xlsx 文件中的数据,删除单元格中的合并并转置某些列以使用 SSIS 在 SQL Server 中提取数据?

scala - 使用 "newAPIHadoopFile"API 时出错

scala - 在spark.sql中使用group by选择多个元素

scala - 通过 Scala Spark 并行读取单独的目录并创建单独的 RDD

azure - 使用 Databricks PySpark 解压缩大文件

c# - SSIS 读取 System.Object 变量并在脚本组件中写入它...如何?

java - Spark 性能中的 map 操作链

apache-spark - Spark DataFrame嵌套结构是否仅限选择?

pandas - Pyspark、Spark SQL 和 toPandas().shape 中计数不一致的原因是什么?

mysql - 使用 nodejs 云函数将 csv 文件导入 Google CloudSQL