SQL方式对hudi表进行操作

news2024/11/20 9:46:56

插入数据

查询数据

更新数据

删除数据

覆盖数据

修改表结构

修改分区 


插入数据

        默认情况下,如果提供了preCombineKey,则insert into的写操作类型为upsert,否则使用insert。

向非分区表插入数据

insert into hudi_cow_nonpcf_tbl select 1, 'a1', 20;

 向分区表动态分区插入数据

insert into hudi_cow_pt_tbl partition (dt, hh)
select 1 as id, 'a1' as name, 1000 as ts, '2021-12-09' as dt, '10' as hh;

向分区表静态分区插入数据

insert into hudi_cow_pt_tbl partition(dt = '2021-12-09', hh='11') select 2, 'a2', 1000;

使用bulk_insert插入数据 

        非严格模式的开启:

set hoodie.sql.insert.mode=non-strict;

         bulk_insert的开启

set hoodie.sql.bulk.insert.enable=true;

插入数据:

insert into hudi_mor_tbl select 1, 'a1_2', 20, 1002;
select id, name, price, ts from hudi_mor_tbl;
1   a1_2    20.0    1002

查询数据

普通查询

select fare, begin_lon, begin_lat, ts from  hudi_tb where fare > 20.0;

时间旅行查询

        Hudi从0.9.0开始就支持时间旅行查询。Spark SQL方式要求Spark版本 3.2及以上。

-- 关闭前面开启的bulk_insert

set hoodie.sql.bulk.insert.enable=false;

create table hudi_cow_pt_tbl1 (
  id bigint,
  name string,
  ts bigint,
  dt string,
  hh string
) using hudi
tblproperties (
  type = 'cow',
  primaryKey = 'id',
  preCombineField = 'ts'
 )
partitioned by (dt, hh)
location '/tmp/hudi/hudi_cow_pt_tbl1';


-- 插入一条id为1的数据
insert into hudi_cow_pt_tbl1 select 1, 'a0', 1000, '2021-12-09', '10';
select * from hudi_cow_pt_tbl1;

-- 修改id为1的数据
insert into hudi_cow_pt_tbl1 select 1, 'a1', 1001, '2021-12-09', '10';
select * from hudi_cow_pt_tbl1;

-- 基于第一次提交时间进行时间旅行
select * from hudi_cow_pt_tbl1 timestamp as of '20220307091628793' where id = 1;

-- 其他时间格式的时间旅行写法
select * from hudi_cow_pt_tbl1 timestamp as of '2022-03-07 09:16:28.100' where id = 1;

select * from hudi_cow_pt_tbl1 timestamp as of '2022-03-08' where id = 1;

更新数据

update语法 :

        更新操作需要指定preCombineField 

update 表名 set 字段 = 值 where 过滤条件

 执行更新:

update hudi_mor_tbl set price = price * 2, ts = 1111 where id = 1;

 

MergeInto语法

启动hiveserver2 

hiveserver2 &

        与join语法类似需要指定一个主表和一个源数据表然后通过匹配来执行修改表数据的语法

-- 准备source表:非分区的hudi表,插入数据
create table merge_source (id int, name string, price double, ts bigint) using hudi
tblproperties (primaryKey = 'id', preCombineField = 'ts');


insert into merge_source values (1, "old_a1", 22.22, 2900), (2, "new_a2", 33.33, 2000), (3, "new_a3", 44.44, 2000);

merge into hudi_mor_tbl as target
using merge_source as source
on target.id = source.id
when matched then update set *
when not matched then insert * ;
-- 准备source表:分区的parquet表,插入数据
create table merge_source2 (id int, name string, flag string, dt string,hh string) using parquet;
insert into merge_source2 values (1, "new_a1", 'update', '2021-12-09', '10'), (2, "new_a2", 'delete', '2021-12-09', '11'), (3, "new_a3", 'insert', '2021-12-09', '12');

merge into hudi_cow_pt_tbl1 as target
using (
  select id, name, '2000' as ts, flag, dt, hh from merge_source2
) source
on target.id = source.id
when matched and flag != 'delete' then
 update set id = source.id, name = source.name, ts = source.ts, dt = source.dt, hh = source.hh
when matched and flag = 'delete' then delete
when not matched then
 insert (id, name, ts, dt, hh) values(source.id, source.name, source.ts, source.dt, source.hh);

 删除数据

语法

DELETE FROM 表名 where 过滤条件;
delete from hudi_cow_nonpcf_tbl where uuid = 1;

 覆盖数据

  • 使用INSERT_OVERWRITE类型的写操作覆盖分区表
  • 使用INSERT_OVERWRITE_TABLE类型的写操作插入覆盖非分区表或分区表(动态分区)

insert overwrite 非分区表

insert overwrite hudi_mor_tbl select 99, 'a99', 20.0, 900;

通过动态分区insert overwrite table到分区表 

        会根据最后的一个字段作为分区字段去匹配

insert overwrite table hudi_cow_pt_tbl1 select 10, 'a10', 1100, '2021-12-09';

通过静态分区insert overwrite 分区表

insert overwrite hudi_cow_pt_tbl1 partition(dt = '2021-12-09') select 13, 'a13', 1100;

修改表结构

修改表名

ALTER TABLE oldTableName RENAME TO newTableName

添加字段

ALTER TABLE 表名 ADD COLUMNS(字段名 类型)

改变列

ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 类型

修改参数属性

ALTER TABLE tableIdentifier SET TBLPROPERTIES (key = 'value')

修改分区 

        show partition结果是基于文件系统表路径的。删除整个分区数据或直接删除某个分区目录并不精确。

查看表分区

show partitions 表名;

删除分区

alter table 表名 drop partition (dt='2021-12-09');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/541180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通达信获取行情主站ip地址方法

最近使用通达信的pytdx来获取股票行情,需要通达信的行情站的ip地址与端口,这里做个记录防止忘了 1 测试代码 pip install pytdx from pytdx.hq import TdxHq_API api TdxHq_API() with api.connect(‘121.36.81.195’, 7709):#通达信行情站地址、端口…

摸摸索索总结下项目生命周期经验

业务调研 主要是完全跟技术无关,站在业务的角度去定义系统要干嘛 组织结构图 部门岗位 业务流程图 泳道图,一级业务流程二级业务流程 系统多个模块的整体业务流程 每个模块内部的业务流程 业务需求 需求分析 站在技术的角度,去分析系…

JavaWeb-JSP的学习

JSP 今日目标: 理解 JSP 及 JSP 原理能在 JSP中使用 EL表达式 和 JSTL标签理解 MVC模式 和 三层架构能完成品牌数据的增删改查功能 1、JSP 概述 JSP(全称:Java Server Pages):Java 服务端页面。是一种动态的网页技术…

深拷贝和浅拷贝-M

深拷贝和浅拷贝 数据类型分为:基本数据类型和引用类型 首先基本数据类型分为:number,string,boolean,null,undefined,symbol以及未来ES10新增的BigInt(任意精度整数)七类。 引用类型分为Array,Object,Function,正则等…

Charles 流量配置(弱网测试)、断点调试

一、流量配置 流量配置主要是用来检测软件(APP)在不同的网络环境下的一个表现,例如出现丢包闪退等情况. 流量配置主要有以下四步: 在 Charles 窗口中点击菜单 “Proxy” ,选择 "Throttle Setting" 进行网络…

ChatGPT副业赚钱·Midjourney之logo设计《猪八戒网站接单制作Logo》- 第10篇

历史文章 文心一言 PK ChatGPT,二者究竟谁更胜一筹 - 第7篇 用Midjourney画个美女,AI绘画也太强大了!!! - 第8篇 推荐一款idea神级代码插件【Bito-ChatGPT】而且免费!- 第9篇 ​ 悟纤:师傅&a…

合理利用Optional 来避免NPE

一、什么是Optional 在Java中什么异常最容易出现,那肯定是NullPointerException,空指针就像一个定时炸弹,总给我们带来些麻烦,在开发过程中都会碰到需要判断Null值以防止空指针的情况,以往的方式要么是抛异常&#xf…

(3)---STM32通信

目录 【1】通信的基础知识 【2】USART 【3】串口通信协议 【4】相关寄存器 串口控制寄存器 波特率寄存器 中断和状态寄存器 数据发送寄存器 数据接收寄存器 【5】 USART功能框图 【6】串口发送实验 实验要求 1.观察实物 2.分析原理图 3.STM32CubeMX配置 4、寄存器方式编写…

选择性搜索算法(Selective Search )——SS算法

文章目录 一、前言二、object Detection VS object Recognition(Selective Search的提出)2.1object recognition与object detection的关系2.2滑动窗口方法的局限性2.3Selective search算法的提出 三、Selective Search算法3.1什么是Selective Search&…

ChatGPT工作提效之遇强则强

ChatGPT工作提效之遇强则强 前言一、如何使用ChatGPT二、ChatGPT实战应用三、ChatGPT会叫的小孩有奶吃工具类的交互问答类的交互开发类的交互 前言 读《笑傲江湖》西湖比剑时,对于独孤九剑1的解读印象颇为深刻。令狐冲被任我行这个高手激发出许多精妙的剑招。这独孤…

消息队列-RabbitMQ

文章目录 1.什么是MQ1.1 特点1.2 MQ产品分类 2.RabbitMQ2.1.RabbitMQ介绍2.2.使用Docker安装RabbitMQ 3.SpringBoot中使用RabbitMQ3.1.SpringAMQP3.2使用步骤 1.什么是MQ RabbitMQ官方文档 消息队列(Message Queue,简称MQ):是在消息的传输过程中保存消…

Learning C++ No.22【二叉树OJ题实战】

文章目录 引言:第一题:根据二叉树创建字符串第二题:二叉树的层序遍历第三题:自底向上实现层序遍历第四题:二叉树的最近公共祖先第五题:将搜索二叉树转换成双向链表第六题:从前序和中序遍历序列构…

修改USRPx410的ip地址

用 .\uhd_find_devices.exe查询设备 打印信息解释如下 在C:\Program Files\UHD\bin下打开powershell,输入如下指令ssh root@192.168.10.2 进入到设备内部 输入ifconfig,获取每个口的地址 输入ifconfig sfp0 192.168.10.3进行修改 重新.\uhd_find_devices.exe查询设备。 …

Linux:软件安装方法与命令yum.扩展ubantu系统的软件安装方法与命令apt

Linux:软件安装方法与命令yum: 这里的search可以想象成在linux的应用商店内搜索 例: 通过yum安装wget这个软件。 search搜索wget: 发现在“linux的应用市场”内有wget这个软件,现在再用yum -y install wget安装(上面已…

你好:Zookeeper

Zookeeper 初识 初识ZookeeperZookeeper 安装Zookeeper 命令操作Zookeeper数据模型服务端命令客户端命令JavaAPI操作Curator常用操作:前置环境连接Zookeeper集群创建节点查询节点修改节点删除节点事件监听机制 – Watch分布式锁实现分布式锁得API 初识Zookeeper Zo…

排序篇:外排序(排序文件中的数据)

目录 前言: 一:大体思路 二:分割成有序的小文件 (1)先给代码 (2)解析 三:进行文件归并 (1)主逻辑 (2)归并两个有序文件 四:全部代码 前言: 如果要排序的数据量非常大,内存无法容纳&…

零基础自学软件测试我只用了105天,从月薪3000到15K, 我整理的超全学习指南!

我21年毕业于管理类专业,干了大半年行政打杂,工作平淡无快感。性格较内向,思维严谨独立。喜欢软件测试工作内容的系统性,技术性,丰富性。以上便是转行的最初心理,大家觉得可妥?说干就干去年6月底…

(前期准备工作2)白嫖Replit的免费云服务器搭建属于自己的应用

Replit介绍 Replit(原来是https://repl.it)是一个基于浏览器的云端协同开发平台,可用于构建开发环境、实时协作、托管网络应用等。Replit提供可创建动态或者静态网站的容器,并会自动生成免费https域名(格式为:项目名.用户名.http://repl.co)。这代表着任何人都可以试用…

Kafka的工作原理

一、Kafka是什么? Kafka是一个分布式的基于发布/订阅模式的消息队列。分布式消息队列可以看成是将这种先进先出的数据结构独立部署在服务器上,应用程序可以通过远程访问接口使用它。 二、Kafka的工作机制是什么? 1.基本概念 2.消息模型 发…

WiFi基础学习到实战(六:Beacon帧字段解析)

欢迎大家一起学习探讨通信之WLAN。上节我们基于Android设备分析了WiFi扫描的代码实现,具体执行WiFi网络扫描由WiFi模块实现。WLAN协议定义扫描方式有“被动扫描”和“主动扫描”。本节继续分析“被动扫描”依赖Beacon帧中的字段。 好。我们先来看Android11 WiFi扫描…