渐变维度 使用 Apache Hudi 实现 SCD-2

数据是当今分析世界的宝贵资产 。在向最终用户提供数据时,跟踪数据在一段时间内的变化非常重要 。渐变维度 (SCD) 是随时间推移存储和管理当前和历史数据的维度 。在 SCD 的类型中,我们将特别关注类型 2(SCD 2),它保留了值的完整历史 。每条记录都包含有效时间和到期时间,以标识记录处于活动状态的时间段 。这可以通过少数审计列来实现 。例如:生效开始日期、生效结束日期和活动记录指示器 。让我们了解如何使用 Apache Hudi 来实现这种 SCD-2 表设计 。

Apache Hudi 是下一代流数据湖平台 。Apache Hudi 将核心仓库和数据库功能直接引入数据湖 。Hudi 提供表、事务、高效的 upserts/deletes、高级索引、流式摄取服务、数据Clustering/压缩优化和并发性,同时将数据保持为开源文件格式 。
Apache Hudi 默认显示表中的快照数据,即最近提交的最新数据 。如果我们想跟踪历史变化,我们需要利用 Hudi 的时间点查询(https://hudi.apache.org/docs/quick-start-guide#point-in-time-query)
Hudi 允许通过时间点查询旧版本数据或最新数据和时间旅行,通过时间点查询遍历历史数据变化是不高效的,需要对给定数据进行多次时间间隔分析 。让我们看看如何通过使用经典方法的解决方法来克服这个问题 。让我们考虑一个包含产品详细信息和卖家折扣的表 。
+---------+--------------+---------------+---------------+-------------------+-------------------+-------------------+--------+|seller_id|prod_category |product_name   |product_package|discount_percentage|eff_start_ts       |eff_end_ts         |actv_ind|+---------+--------------+---------------+---------------+-------------------+-------------------+-------------------+--------+|3412     |Healthcare    |Dolo 650       |10             |10                 |2022-04-01 16:30:45|9999-12-31 23:59:59|1       ||1234     |Detergent     |Tide 2L        |6              |15                 |2021-12-15 15:20:30|9999-12-31 23:59:59|1       ||1234     |Home Essential|Hand Towel     |12             |20                 |2021-10-20 06:55:22|9999-12-31 23:59:59|1       ||4565     |Gourmet       |Dairy Milk Silk|6              |30                 |2021-06-12 20:30:40|9999-12-31 23:59:59|1       |+---------+--------------+---------------+---------------+-------------------+-------------------+-------------------+--------+步骤
  1. 让我们使用 Spark 将这些数据写入 Hudi 表中
spark-shell \--packages org.apache.hudi:hudi-spark-bundle_2.12:0.11.1,org.apache.spark:spark-avro_2.12:2.4.7,org.apache.avro:avro:1.8.2 \--conf "spark.serializer=org.apache.spark.serializer.KryoSerializer" \--conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension' \--conf "spark.sql.hive.convertMetastoreParquet=false"

经验总结扩展阅读