数据是当今分析世界的宝贵资产 。在向最终用户提供数据时,跟踪数据在一段时间内的变化非常重要 。渐变维度 (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 |+---------+--------------+---------------+---------------+-------------------+-------------------+-------------------+--------+步骤
- 让我们使用 Spark 将这些数据写入 Hudi 表中
Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /___/ .__/\_,_/_/ /_/\_\ version 2.4.8 /_/Using Scala version 2.12.10 (OpenJDK 64-Bit Server VM, Java 1.8.0_312)Type in expressions to have them evaluated.Type :help for more information.scala> spark.sql("""create table hudi_product_catalog ( | seller_id int, | prod_category string, | product_name string, | product_package string, | discount_percentage string, | eff_start_ts timestamp, | eff_end_ts timestamp, | actv_ind int | ) using hudi | tblproperties ( | type = 'cow', | primaryKey = 'seller_id,prod_category,eff_end_ts', | preCombineField = 'eff_start_ts' | ) | partitioned by (actv_ind) | location 'gs://target_bucket/hudi_product_catalog/'""")
推荐阅读
- iptables使用详解
- 华为车载智慧屏值得买吗_华为车载智慧屏使用评测
- Pytest进阶使用
- 如何使用 pyqt 读取串口传输的图像
- 数据科学学习手札144 使用管道操作符高效书写Python代码
- 你们觉得华为手机卡不卡,使用体验如何(华为加装nm卡缺点)
- 古墓丽影10怎么打飞机(古墓丽影10怎么使用榴弹)
- JavaFx 使用字体图标记录
- uni-app 如何优雅的使用权限认证并对本地文件上下起手
- 手把手教你玩转 Gitea|使用 Helm 在 K3s 上安装 Gitea