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域名转发https访问的实现
Mar 31 Servers
Nginx配置https的实现
Nov 27 Servers
Z-Order加速Hudi大规模数据集方案分析
Mar 31 Servers
Dashboard管理Kubernetes集群与API访问配置
Apr 01 Servers
Windows Server 2019 安装DHCP服务及相关配置
Apr 28 Servers
win server2012 r2服务器共享文件夹如何设置
Jun 21 Servers
nginx之内存池的实现
Jun 28 Servers
Windows server 2003卸载和安装IIS的图文教程
Jul 15 Servers
Windows Server 2012 R2服务器安装与配置的完整步骤
Jul 15 Servers
centos环境下nginx高可用集群的搭建指南
Jul 23 Servers
ubuntu开机后ROS程序自启动问题
Dec 24 Servers
Nginx工作模式及代理配置的使用细节
nginx常用配置conf的示例代码详解
Mar 21 #Servers
Nginx设置HTTPS的方法步骤 443证书配置方法
nginx共享内存的机制详解
Nginx的基本概念和原理
解决xampp安装后Apache无法启动
Nginx图片服务器配置之后图片访问404的问题解决
You might like
可定制的PHP缩略图生成程式(需要GD库支持)
2007/03/06 PHP
对Session和Cookie的区分与解释
2007/03/16 PHP
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
mcrypt启用 加密以及解密过程详细解析
2013/08/07 PHP
PHP常用处理静态操作类
2015/04/03 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
2017/05/20 PHP
PDO::rollBack讲解
2019/01/29 PHP
js或css实现滚动广告的几种方案
2010/01/28 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
js设置function参数默认值(适合没有传参情况)
2014/02/24 Javascript
jQuery中click事件的定义和用法
2014/12/20 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
JavaScript获取网页支持表单字符集的方法
2015/04/02 Javascript
浅谈javascript中基本包装类型
2015/06/03 Javascript
javascript伸缩菜单栏实现代码分享
2015/11/12 Javascript
基于Javascript实现二级联动菜单效果
2016/03/04 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
Google开源的Python格式化工具YAPF的安装和使用教程
2016/05/31 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
基于python神经卷积网络的人脸识别
2018/05/24 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
详解python实现数据归一化处理的方式:(0,1)标准化
2019/07/17 Python
Keras模型转成tensorflow的.pb操作
2020/07/06 Python
python中实现栈的三种方法
2020/12/19 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
StubHub中国:购买和出售全球活动门票
2020/01/01 全球购物
住宅使用说明书
2014/05/09 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
详解Java实现数据结构之并查集
2021/06/23 Java/Android