最终效果
欢迎关注我的公众号:伦少的博客

语法:
/*+ hoodie_prop('${tableName}', map('${key1}', '${value1}', '${key2}', ''${value2}'')) */
样例:
1.查询两张 hudi 表的区间增量
select
/*+
hoodie_prop(
'default.h1',
map('hoodie.datasource.read.begin.instanttime', '20221127083503537', 'hoodie.datasource.read.end.instanttime', '20221127083506081')
),
hoodie_prop(
'default.h2',
map('hoodie.datasource.read.begin.instanttime', '20221127083508715', 'hoodie.datasource.read.end.instanttime', '20221127083511803')
)
*/
id, name, price, ts
from (
select id, name, price, ts
from default.h1
union all
select id, name, price, ts
from default.h2
)
2. 时间旅行:
select /*+ hoodie_prop('default.h1', map('as.of.instant', '20221127102741536')) */)
3. 对一张 hudi 表,ro, rt 查询方式转化:
# 查 mor 的 ro 表
select /*+ hoodie_prop('default.h1', map('hoodie.datasource.query.type', 'read_optimized')) */
# 查 mor 的 rt 表
select /*+ hoodie_prop('default.h1', map('hoodie.datasource.query.type', 'snapshot')) */
等等
通过 Hint 实现 hudi 查询参数传递
以增量查询为例
Hudi 的增量查询有几个参数,
hoodie.datasource.read.begin.instanttime 指定起始 instant
hoodie.datasource.read.end.instanttime 指定结束 instant,左开右闭
hoodie.datasource.query.type 设置为 incremental 增量读模式
通过上篇 Spark SQL Hints 原理 了解到,对于 hudi 的 prop 传递,比 join 是简单很多的,只需有一个步骤即可。自定义 Rule 作用于 UnresolvedHint,找到对应的 relation,直接将参数提取出来生成新的 relation,并消除 UnresolvedHint
通过 hudi 代码了解,我们需要将参数在使用 DefaultSource create relation 之前传递过去,创建相应的 relation

对于 v1Table,spark 通过 FindDataSourceTable Rule 进行 dataSource 和 relation 的创建,这里选择在 hudi 比较容易支持的 v2Table 进行增强测试
自定义 Ruler 解析 Hint
预期语法:
/*+ hoodie_prop('table_name', map('key1', 'value1', 'key2', 'value2')) */
针对 v2Table 的 relation 是 DataSourceV2Relation,参考 spark COALESCE Hints 实现,我们可以得到自定义 Ruler 的核心代码如下:
对于 hint 的 parametersInHints,第一个提取后作为 tableName,进行绑定判断当前 relation 是否是所需的,然后将后面的 Map 类型提取出来,将 key -> values 全部作为 DataSourceV2Relation 的 options 参数传入

然后在 createRelation 时将这个 options 作为 relation 的 conf 部分加入即可

使用开头的案例效果如下:
select
/*+
hoodie_prop(
'default.h1',
map('hoodie.datasource.read.begin.instanttime', '20221127102741536', 'hoodie.datasource.read.end.instanttime', '20221127102744496')
),
hoodie_prop(
'default.h2',
map('hoodie.datasource.read.begin.instanttime', '20221127102747486', 'hoodie.datasource.read.end.instanttime', '20221127102750523')
)
*/
id, name, price, ts
from (
select id, name, price, ts
from default.h0
union all
select id, name, price, ts
from default.h1
)
对于 default.h0 表 relation 成功使用 IncrementalRelation,并且 begin 和 end 也有指定

default.h1 同上

结论
本篇描述并实践了如何通过 Hint 将 hudi relation 使用的参数传递给指定的表,而不使用类似时间旅行的语法增强的方式将 hudi 的功能 sql 化,也可以达到表级别的参数设置。时间旅行实际上也是设置某个 hudi 的参数,包括对同一张 hudi 表的不同 query type 参数设置改变不同的查询行为。
相关链接
🧐 分享、点赞、在看,给个3连击呗!👇




