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开启Brotli压缩算法实现过程详解
Mar 31 Servers
win10安装配置nginx的过程
Mar 31 Servers
详解nginx安装过程并代理下载服务器文件
Feb 12 Servers
Apache Hudi数据布局黑科技降低一半查询时间
Mar 31 Servers
教你使用Jenkins集成Harbor自动发布镜像
Apr 03 Servers
阿里云服务器部署RabbitMQ集群的详细教程
Jun 01 Servers
Linux中文件的基本属性介绍
Jun 01 Servers
win server2012 r2服务器共享文件夹如何设置
Jun 21 Servers
Zabbix对Kafka topic积压数据监控的问题(bug优化)
Jul 07 Servers
Windows server 2003卸载和安装IIS的图文教程
Jul 15 Servers
SpringBoot前端后端分离之Nginx服务器下载安装过程
Aug 14 Servers
教你使用Ubuntu搭建DNS服务器
Sep 23 Servers
Nginx工作模式及代理配置的使用细节
nginx常用配置conf的示例代码详解
Mar 21 #Servers
Nginx设置HTTPS的方法步骤 443证书配置方法
nginx共享内存的机制详解
Nginx的基本概念和原理
解决xampp安装后Apache无法启动
Nginx图片服务器配置之后图片访问404的问题解决
You might like
php FPDF类库应用实现代码
2009/03/20 PHP
php 传值赋值与引用赋值的区别
2010/12/29 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
2015/03/18 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
浅谈javascript的数据类型检测
2010/07/10 Javascript
js计算精度问题小结
2013/04/22 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
js变量提升深入理解
2016/09/16 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
2017/06/08 Javascript
canvas基础绘制-绚丽倒计时的实例
2017/09/17 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
js实现拖动缓动效果
2020/01/13 Javascript
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
朴素贝叶斯算法的python实现方法
2014/11/18 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
2019/06/04 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
用Python解数独的方法示例
2019/10/24 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
CSS3弹性盒模型开发笔记(三)
2016/04/26 HTML / CSS
个人近期表现材料
2014/02/11 职场文书
统计系教授推荐信
2014/02/28 职场文书
大学专科求职信
2014/07/02 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
2015年父亲节活动总结
2015/02/12 职场文书
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server
如何创建一个创建MySQL数据库中的datetime类型
2022/03/21 MySQL
SQL语句多表联合查询的方法示例
2022/04/18 MySQL