Apache Hudi集成Spark SQL操作hide表


Posted in Servers onMarch 31, 2022

1. 摘要

社区小伙伴一直期待的Hudi整合Spark SQL的PR正在积极Review中并已经快接近尾声,Hudi集成Spark SQL预计会在下个版本正式发布,在集成Spark SQL后,会极大方便用户对Hudi表的DDL/DML操作,下面就来看看如何使用Spark SQL操作Hudi表。

2. 环境准备

首先需要将PR拉取到本地打包,生成SPARK_BUNDLE_JAR(hudi-spark-bundle_2.11-0.9.0-SNAPSHOT.jar)包

2.1 启动spark-sql

在配置完spark环境后可通过如下命令启动spark-sql

spark-sql --jars $PATH_TO_SPARK_BUNDLE_JAR  --conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' --conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension'

2.2 设置并发度

由于Hudi默认upsert/insert/delete的并发度是1500,对于演示的小规模数据集可设置更小的并发度。

set hoodie.upsert.shuffle.parallelism = 1;
set hoodie.insert.shuffle.parallelism = 1;
set hoodie.delete.shuffle.parallelism = 1;

同时设置不同步Hudi表元数据

set hoodie.datasource.meta.sync.enable=false;

3. Create Table

使用如下SQL创建表

create table test_hudi_table (
  id int,
  name string,
  price double,
  ts long,
  dt string
) using hudi
 partitioned by (dt)
 options (
  primaryKey = 'id',
  type = 'mor'
 )
 location 'file:///tmp/test_hudi_table'

说明:表类型为MOR,主键为id,分区字段为dt,合并字段默认为ts。

创建Hudi表后查看创建的Hudi表

show create table test_hudi_table

Apache Hudi集成Spark SQL操作hide表

4. Insert Into

4.1 Insert

使用如下SQL插入一条记录

insert into test_hudi_table select 1 as id, 'hudi' as name, 10 as price, 1000 as ts, '2021-05-05' as dt

insert完成后查看Hudi表本地目录结构,生成的元数据、分区和数据与Spark Datasource写入均相同。

Apache Hudi集成Spark SQL操作hide表

4.2 Select

使用如下SQL查询Hudi表数据

select * from test_hudi_table

查询结果如下

Apache Hudi集成Spark SQL操作hide表

5. Update

5.1 Update

使用如下SQL将id为1的price字段值变更为20

update test_hudi_table set price = 20.0 where id = 1

5.2 Select

再次查询Hudi表数据

select * from test_hudi_table

查询结果如下,可以看到price已经变成了20.0

Apache Hudi集成Spark SQL操作hide表

查看Hudi表的本地目录结构如下,可以看到在update之后又生成了一个deltacommit,同时生成了一个增量log文件。

Apache Hudi集成Spark SQL操作hide表

6. Delete

6.1 Delete

使用如下SQL将id=1的记录删除

delete from test_hudi_table where id = 1

查看Hudi表的本地目录结构如下,可以看到delete之后又生成了一个deltacommit,同时生成了一个增量log文件。

Apache Hudi集成Spark SQL操作hide表

6.2 Select

再次查询Hudi表

select * from test_hudi_table;

查询结果如下,可以看到已经查询不到任何数据了,表明Hudi表中已经不存在任何记录了。

Apache Hudi集成Spark SQL操作hide表

7. Merge Into

7.1 Merge Into Insert

使用如下SQL向test_hudi_table插入数据

merge into test_hudi_table as t0
 using (
  select 1 as id, 'a1' as name, 10 as price, 1000 as ts, '2021-03-21' as dt
 ) as s0
 on t0.id = s0.id
 when not matched and s0.id % 2 = 1 then insert *

7.2 Select

查询Hudi表数据

select * from test_hudi_table

查询结果如下,可以看到Hudi表中存在一条记录

Apache Hudi集成Spark SQL操作hide表

7.4 Merge Into Update

使用如下SQL更新数据

merge into test_hudi_table as t0
 using (
  select 1 as id, 'a1' as name, 12 as price, 1001 as ts, '2021-03-21' as dt
 ) as s0
 on t0.id = s0.id
 when matched and s0.id % 2 = 1 then update set *

7.5 Select

查询Hudi表

select * from test_hudi_table

查询结果如下,可以看到Hudi表中的分区已经更新了

Apache Hudi集成Spark SQL操作hide表

7.6 Merge Into Delete

使用如下SQL删除数据

merge into test_hudi_table t0
 using (
  select 1 as s_id, 'a2' as s_name, 15 as s_price, 1001 as s_ts, '2021-03-21' as dt
 ) s0
 on t0.id = s0.s_id
 when matched and s_ts = 1001 then delete

查询结果如下,可以看到Hudi表中已经没有数据了

Apache Hudi集成Spark SQL操作hide表

8. 删除表

使用如下命令删除Hudi表

drop table test_hudi_table;

使用show tables查看表是否存在

show tables;

可以看到已经没有表了

Apache Hudi集成Spark SQL操作hide表

9. 总结

通过上面示例简单展示了通过Spark SQL Insert/Update/Delete Hudi表数据,通过SQL方式可以非常方便地操作Hudi表,降低了使用Hudi的门槛。另外Hudi集成Spark SQL工作将继续完善语法,尽量对标Snowflake和BigQuery的语法,如插入多张表(INSERT ALL WHEN condition1 INTO t1 WHEN condition2 into t2),变更Schema以及CALL Cleaner、CALL Clustering等Hudi表服务。

以上就是Apache Hudi集成Spark SQL操作hide表的详细内容,更多关于Apache Hudi集成Spark SQL的资料请关注三水点靠木其它相关文章!

Servers 相关文章推荐
nginx网站服务如何配置防盗链(推荐)
Mar 31 Servers
Nginx服务器如何设置url链接
Mar 31 Servers
Nginx已编译的nginx-添加新模块
Apr 01 Servers
Apache POI的基本使用详解
Nov 07 Servers
NGINX 权限控制文件预览和下载的实现原理
Jan 18 Servers
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
Feb 12 Servers
Apache Pulsar集群搭建部署详细过程
Feb 12 Servers
Apache Hudi数据布局黑科技降低一半查询时间
Mar 31 Servers
zabbix配置nginx监控的实现
May 25 Servers
使用 DataAnt 监控 Apache APISIX的原理解析
Jul 07 Servers
Nginx 502 bad gateway错误解决的九种方案及原因
Aug 14 Servers
服务器nginx权限被拒绝解决案例
Sep 23 Servers
Nginx工作模式及代理配置的使用细节
nginx常用配置conf的示例代码详解
Mar 21 #Servers
Nginx设置HTTPS的方法步骤 443证书配置方法
nginx共享内存的机制详解
Nginx的基本概念和原理
解决xampp安装后Apache无法启动
Nginx图片服务器配置之后图片访问404的问题解决
You might like
php学习笔记 [预定义数组(超全局数组)]
2011/06/09 PHP
js innerHTML 的一些问题的解决方法
2008/06/22 Javascript
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
JavaScript DOM 学习第七章 表单的扩展
2010/02/19 Javascript
重写javascript中window.confirm的行为
2012/10/21 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
2016/01/12 Javascript
浅谈Cookie的生命周期问题
2016/08/02 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
微信小程序网络封装(简单高效)
2018/08/06 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
Python入门篇之字符串
2014/10/17 Python
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
python处理xml文件的方法小结
2017/05/02 Python
用Python3创建httpServer的简单方法
2018/06/04 Python
用python脚本24小时刷浏览器的访问量方法
2018/12/07 Python
python 弹窗提示警告框MessageBox的实例
2019/06/18 Python
python 实现绘制整齐的表格
2019/11/18 Python
深入了解Python enumerate和zip
2020/07/16 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
台湾生鲜宅配:大口市集
2017/10/14 全球购物
单位领导证婚词
2014/01/14 职场文书
村委会主任先进事迹
2014/01/15 职场文书
国贸专业的职业规划范文
2014/01/23 职场文书
快餐公司创业计划书
2014/04/29 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
教务处干事工作总结
2015/08/14 职场文书
Python 把两层列表展开平铺成一层(5种实现方式)
2021/04/07 Python
Java常用函数式接口总结
2021/06/29 Java/Android
Spring Cloud 中@FeignClient注解中的contextId属性详解
2021/09/25 Java/Android