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如何将http访问的网站改成https访问
Mar 31 Servers
nginx基于域名,端口,不同IP的虚拟主机设置的实现
Mar 31 Servers
Nginx代理同域名前后端分离项目的完整步骤
Mar 31 Servers
配置nginx 重定向到系统维护页面
Jun 08 Servers
Nginx配置之实现多台服务器负载均衡
Aug 02 Servers
学习nginx基础知识
Sep 04 Servers
nginx中proxy_pass各种用法详解
Nov 07 Servers
苹果M1芯片安装nginx 并且部署vue项目步骤详解
Nov 20 Servers
nginx配置限速限流基于内置模块
May 02 Servers
Nginx本地配置SSL访问的实例教程
May 30 Servers
源码安装apache脚本部署过程详解
Sep 23 Servers
Shell中的单中括号和双中括号的用法详解
Dec 24 Servers
Nginx工作模式及代理配置的使用细节
nginx常用配置conf的示例代码详解
Mar 21 #Servers
Nginx设置HTTPS的方法步骤 443证书配置方法
nginx共享内存的机制详解
Nginx的基本概念和原理
解决xampp安装后Apache无法启动
Nginx图片服务器配置之后图片访问404的问题解决
You might like
用缓存实现静态页面的测试
2006/12/06 PHP
分享一个超好用的php header下载函数
2014/01/31 PHP
destoon安全设置中需要设置可写权限的目录及文件
2014/06/21 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
2014/07/08 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
phpstorm 配置xdebug的示例代码
2019/03/31 PHP
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
jquery实现相册一下滑动两次的方法
2015/02/09 Javascript
JavaScript中的this机制
2016/01/30 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
JavaScript队列的应用实例详解【经典数据结构】
2017/04/12 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
2020/02/06 Javascript
JQuery实现折叠式菜单的详细代码
2020/06/03 jQuery
js观察者模式的弹幕案例
2020/11/23 Javascript
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
Python简单实现Base64编码和解码的方法
2017/04/29 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
Python通过命令开启http.server服务器的方法
2017/11/04 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
python实现图像拼接
2020/03/05 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
Python Dataframe常见索引方式详解
2020/05/27 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
10个python爬虫入门实例(小结)
2020/11/01 Python
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
应届生自我鉴定
2013/12/11 职场文书
十佳护士获奖感言
2014/02/18 职场文书
环保公益广告语
2014/03/13 职场文书
法定代表人授权委托书
2014/09/19 职场文书
农业项目合作意向书
2015/05/08 职场文书
教育教学读书笔记
2015/07/02 职场文书
2019年大学推荐信
2019/06/24 职场文书
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis
详解Python+OpenCV绘制灰度直方图
2022/03/22 Python