Hudi 表类型和查询类型

本文介绍了Hudi数据湖中表类型的定义,包括Copy-On-Write和Merge-On-Read,以及各种查询类型如快照查询、增量查询(CDC)、读取优化和时间旅行查询。Hudi通过列存储和行存储格式优化数据组织和性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据湖hudi的表类型定义了数据在DFS上如何组织布局,同时实现一些timeline等操作(表类型定定义数据是如何写入的);查询类型则是定义如何读取DFS上的数据。

Table typequery type
Copy-On-Write

快照查询;

增量查询;

增量CDC;

时间旅行;

Merge-On-Read

快照查询;

增量查询;

读取优化查询;

时间旅行;

表类型

1.copy-on-write

使用列存储格式parquet组织数据,产生新版本的数据文件,是通过在写入期间执行同步合并重新产生新文件。 

2.merge-On-Read

使用列加行的格式来组织数据,更新的数据写入到增量文件中,在将增量的数据压缩以同步或者异步的方式生成新的版本文件。

查询类型

Hudi支持以下查询:

快照查询:查询查看给定提交或压缩操作时表的最新快照。在读取表上合并的情况下,它通过合并公开近乎实时的数据(几分钟) 实时最新文件切片的基本文件和增量文件。对于写表复制,它提供了现有镶木地板表的直接替代品,同时提供更新插入/删除和其他写入端功能。

增量查询:查询仅查看自给定提交/压缩以来写入表的新数据。 这有效地提供了变更流以启用增量数据管道。默认情况下,这会生成最新的 自时间线中给定点以来的更改快照。

增量查询(CDC):这些是增量查询的子类型,其中查询会查看自此以来所有更改的数据 给定的提交/压缩,而不是更改数据的最新状态。这支持完整的 cdc 风格查询用例 允许查看更改前后的图像以及导致更改的操作。

读取优化查询:查询查看给定提交/压缩操作时表的最新快照。仅公开最新文件切片中的基础/列文件并保证 与非 hudi 列式表相比,列式查询性能相同。

时间旅行查询:查询截至时间轴中给定时间戳的表快照。

### 如何在 Hive 中查询 Hudi 的 Timestamp 类型字段 为了确保能够在 Hive 中正确查询 Hudi 中的 `timestamp` 类型字段,需要确认几个配置项已经设置妥当。 #### 配置 Hoodie 同步工具支持 Timestamp 类型 确保 hoodie 数据源同步工具已配置参数 `hoodie.datasource.hive_sync.support_timestamp=true`[^1]。这一步骤对于使 Hive 能够识别并处理来自 Hudi 的 `timestamp` 字段至关重要。默认情况下,如果未启用此选项,则 `timestamp` 可能被误认为是 `bigint` 类型,从而影响 SQL 查询的结果准确性。 #### 处理日期格式转换 考虑到某些场景下,Hudi 会基于字段的内容自动推测其数据类型,例如将形如 `yyyy-mm-dd` 的字符串视为 `timestamp`[^2]。因此,在执行同步操作前可能有必要先利用自定义函数 (UDF) 将特定列的数据从 Unix 时间戳形式转换成更易读的标准日期格式 (`yyyy-MM-dd`)。可以采用如下 Python 函数来完成这一任务: ```python from pyspark.sql.functions import expr, from_unixtime def transform_date(df, column_names): for column_name in column_names: df = df.withColumn(column_name, from_unixtime(expr(f"{column_name}/1000"), "yyyy-MM-dd")) return df ``` 上述代码片段展示了如何创建一个简单的 UDF 来调整 DataFrame 中指定列的时间示方式,使其更适合于后续分析需求。 #### 执行 Hive 查询语句 一旦完成了以上准备工作之后,就可以像平常一样编写标准的 HiveQL 去访问这些经过适当预处理后的格了。下面给出了一条基本的例子用于检索某张包含 `timestamp` 列的 Hudi 记录: ```sql SELECT * FROM hudi_table WHERE CAST(timestamp_column AS TIMESTAMP) BETWEEN 'start_time' AND 'end_time'; ``` 这里假设目标名为 `hudi_table` 并且有一个叫做 `timestamp_column` 的时间戳列;同时指定了起始时间结束时间范围作为过滤条件的一部分。请注意实际应用时应替换具体的名、列名以及所需的时间区间边界值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值