暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何使用 Spark SQL Hint 对 Hudi 进行增量查询、时间旅行...

伦少的博客 2022-12-01
2852

最终效果

欢迎关注我的公众号:伦少的博客

语法:

/*+ 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 参数设置改变不同的查询行为。

相关链接

Spark SQL Hints 原理

🧐 分享、点赞、在看,给个3连击👇

最后修改时间:2023-08-29 10:39:21
文章转载自伦少的博客,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论