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配置80端口访问8080及项目名地址方法解析
Mar 31 Servers
Mac环境Nginx配置和访问本地静态资源的实现
Mar 31 Servers
如何通过cmd 连接阿里云服务器
Apr 18 Servers
nginx配置之并发频次限制
Apr 18 Servers
Nginx利用Logrotate实现日志分割
May 20 Servers
Nginx 502 bad gateway错误解决的九种方案及原因
Aug 14 Servers
Flink 侧流输出源码示例解析
Sep 23 Servers
CentOS7设置ssh服务以及端口修改方式
Dec 24 Servers
Valheim服务器 Mod修改安装教程 【ValheimPlus】
Dec 24 Servers
码云(gitee)通过git自动同步到阿里云服务器
Dec 24 Servers
ubuntu开机后ROS程序自启动问题
Dec 24 Servers
nginx sticky实现基于cookie负载均衡示例详解
Dec 24 Servers
Nginx工作模式及代理配置的使用细节
nginx常用配置conf的示例代码详解
Mar 21 #Servers
Nginx设置HTTPS的方法步骤 443证书配置方法
nginx共享内存的机制详解
Nginx的基本概念和原理
解决xampp安装后Apache无法启动
Nginx图片服务器配置之后图片访问404的问题解决
You might like
Ajax PHP简单入门教程代码
2008/04/25 PHP
php curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
PHP中防止SQL注入方法详解
2014/12/25 PHP
PHP进行批量任务处理不超时的解决方法
2016/07/11 PHP
php实现博客,论坛图片防盗链的方法
2016/10/15 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
google 搜索框添加关键字实现代码
2010/04/24 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
JS 弹出层 定位至屏幕居中示例
2014/05/21 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
CentOS环境中MySQL修改root密码方法
2018/01/07 Javascript
布同 统计英文单词的个数的python代码
2011/03/13 Python
Python实现从订阅源下载图片的方法
2015/03/11 Python
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
Python返回数组/List长度的实例
2018/06/23 Python
Python实现随机漫步功能
2018/07/09 Python
python梯度下降法的简单示例
2018/08/31 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
在pycharm中实现删除bookmark
2020/02/14 Python
Python Selenium模块安装使用教程详解
2020/07/09 Python
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
如何获取某个日期是当月的最后一天
2013/12/05 面试题
十佳大学生村官事迹
2014/01/09 职场文书
会计岗位职责模板
2014/03/12 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
检讨书怎么写
2015/05/07 职场文书
2015年学校财务工作总结
2015/05/19 职场文书
观看建国大业观后感
2015/06/01 职场文书
收入证明申请书
2015/06/12 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书
读《人生的智慧》有感:闲暇是人生的精华
2019/12/25 职场文书
台积电称即便经济低迷也没有降价的计划
2022/04/21 数码科技