仅使用Spark SQL能否在Hudi中实现增量、时间旅行及快照查询?
纯Spark SQL实现Hudi的快照、增量与时间旅行查询(EMR 6.6.0)
当然可以直接用Spark SQL完成Hudi的这三类查询,不需要通过spark.read创建DataFrame再转临时视图的方式。以下是具体实现方法:
1. 快照查询
快照查询是Hudi的默认查询模式,直接查询表即可获取最新版本的数据:
SELECT * FROM hudi_table;
如果需要显式指定快照查询类型(避免默认行为变更),可以添加查询参数:
SELECT * FROM hudi_table OPTION (hoodie.datasource.query.type = 'snapshot');
2. 增量查询
增量查询需要指定起始提交时间(或起始Instant),通过hoodie.datasource.read.begin.instanttime参数过滤出该时间点之后的新增/变更数据:
SELECT * FROM hudi_table OPTION ( hoodie.datasource.query.type = 'incremental', hoodie.datasource.read.begin.instanttime = '20240520120000' -- 替换为实际起始提交时间 );
若要查询时间范围内的增量数据,可追加结束时间参数:
SELECT * FROM hudi_table OPTION ( hoodie.datasource.query.type = 'incremental', hoodie.datasource.read.begin.instanttime = '20240520120000', hoodie.datasource.read.end.instanttime = '20240521120000' );
3. 时间旅行查询
要回溯到特定时间点的表状态,可通过hoodie.datasource.read.as.of.instanttime参数指定目标时间:
SELECT * FROM hudi_table OPTION ( hoodie.datasource.query.type = 'snapshot', hoodie.datasource.read.as.of.instanttime = '20240520120000' -- 替换为要回溯的时间点 );
EMR 6.6.0适配的Hudi版本还支持更简洁的表名后缀语法:
SELECT * FROM hudi_table@`20240520120000`;
关键注意事项
- 确认EMR集群已配置Hudi的Spark SQL扩展:
spark.sql.extensions需设置为org.apache.hudi.HoodieSparkSessionExtension,EMR 6.6.0默认已配置该参数,若出现异常可检查Spark配置。 - 提交时间需遵循
yyyyMMddHHmmss格式,可通过查询Hudi元数据表(如hudi_table_hoodie_metadata)获取历史提交时间列表。
内容的提问来源于stack exchange,提问作者bigdatabeginner
相关产品推荐
相关产品推荐

