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 多个location转发任意请求或访问静态资源文件的实现
Mar 31 Servers
nginx里的rewrite跳转的实现
Mar 31 Servers
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
Apr 29 Servers
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
Apr 29 Servers
解决IIS7下无法绑定https主机的问题
Apr 29 Servers
排查Tomcat进程假死的问题
May 06 Servers
在虚拟机中安装windows server 2008的图文教程
Jun 28 Servers
Nginx代理Redis哨兵主从配置的实现
Jul 15 Servers
Nginx如何获取自定义请求header头和URL参数详解
Jul 23 Servers
Nginx跨域问题解析与解决
Aug 05 Servers
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
Aug 14 Servers
Nginx工作模式及代理配置的使用细节
nginx常用配置conf的示例代码详解
Mar 21 #Servers
Nginx设置HTTPS的方法步骤 443证书配置方法
nginx共享内存的机制详解
Nginx的基本概念和原理
解决xampp安装后Apache无法启动
Nginx图片服务器配置之后图片访问404的问题解决
You might like
PHP include_path设置技巧分享
2011/07/03 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
JScript 脚本实现文件下载 一般用于下载木马
2009/10/29 Javascript
JavaScript中instanceof运算符的用法总结
2013/11/19 Javascript
浅析js预加载/延迟加载
2014/09/25 Javascript
jquery validate demo 基础
2015/10/29 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
2016/05/17 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
2016/09/16 Javascript
JS仿Base.js实现的继承示例
2017/04/07 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
基于JavaScript实现瀑布流布局
2018/08/15 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
微信小程序在text文本实现多种字体样式
2019/11/08 Javascript
vue vant中picker组件的使用
2020/11/03 Javascript
Python构造函数及解构函数介绍
2015/02/26 Python
python3简单实现微信爬虫
2015/04/09 Python
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
python实现名片管理器的示例代码
2019/12/17 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
英国健身专家:WIT Fitness
2021/02/09 全球购物
门卫岗位职责
2013/11/15 职场文书
创新比赛获奖感言
2014/02/13 职场文书
《影子》教学反思
2014/02/21 职场文书
关于学习的演讲稿
2014/05/10 职场文书
外贸会计专业自荐信
2014/06/22 职场文书
Win11 S Mode版本泄露 正式上线后叫做Windows 11 SE
2021/11/21 数码科技
Java如何实现通过键盘输入一个数组
2022/02/15 Java/Android
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android