漸變維度 使用 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"

經驗總結擴展閱讀