【Hive】——DML

1 Load(加载数据)

1.1 概述

在这里插入图片描述

1.2 语法

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] [INPUTFORMAT 'inputformat' SERDE 'serde'] (3.0 or later)

1.2.1 filepath

在这里插入图片描述

1.2.2 local

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.2.3 overwrite

在这里插入图片描述

1.4 Hive 3.0 Load新特性

在这里插入图片描述

CREATE TABLE if not exists tab1 (col1 int, col2 int)PARTITIONED BY (col3 int)row format delimited fields terminated by ',';
--tab1.txt内容如下
11,22,1
33,44,2
LOAD DATA LOCAL INPATH '/root/data/tab1.txt' INTO TABLE tab1;

1.5 案例

1.5.1 创建表


--step1:建表
--建表student_local 用于演示从本地加载数据
create table student_local(num int,name string,sex string,age int,dept string) row format delimited fields terminated by ',';
--建表student_HDFS  用于演示从HDFS加载数据
create external table student_HDFS(num int,name string,sex string,age int,dept string) row format delimited fields terminated by ',';
--建表student_HDFS_p 用于演示从HDFS加载数据到分区表
create table student_HDFS_p(num int,name string,sex string,age int,dept string) partitioned by(country string) row format delimited fields terminated by ',';

1.5.1 加载数据


-- 从本地加载数据  数据位于HS2(node1)本地文件系统  本质是hadoop fs -put上传操作
LOAD DATA LOCAL INPATH '/root/hivedata/students.txt' INTO TABLE student_local;--从HDFS加载数据  数据位于HDFS文件系统根目录下  本质是hadoop fs -mv 移动操作
--先把数据上传到HDFS上  hadoop fs -put /root/hivedata/students.txt /
LOAD DATA INPATH '/students.txt' INTO TABLE student_HDFS;----从HDFS加载数据到分区表中并制定分区  数据位于HDFS文件系统根目录下
--先把数据上传到HDFS上 hadoop fs -put /root/hivedata/students.txt /
LOAD DATA INPATH '/students.txt' INTO TABLE student_HDFS_p partition(country ="China");

2 insert(插入数据)

2.1 insert

执行过程非常非常慢,原因在于底层是使用MapReduce把数据写入Hive表中

create table t_test_insert(id int,name string,age int);
insert into table t_test_insert values(1,"allen",18);

Hive官方推荐加载数据的方式:清洗数据成为结构化文件,再使用Load语法加载数据到表中。这样的效率更高。

2.2 insert+select

  1. insert+select表示:将后面查询返回的结果作为内容插入到指定表中,注意OVERWRITE将覆盖已有数据。
  2. 需要保证查询结果列的数目和需要插入数据表格的列数目一致。
  3. 如果查询出来的数据类型和插入表格对应的列数据类型不一致,将会进行转换,但是不能保证转换一定成功,转换失败的数据将会为NULL。
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
insert into table student_from_insert select num,name from student;

2.3 Multiple Inserts(多次插入)

翻译为多次插入,多重插入,其核心功能是:一次扫描,多次插入。
语法目的就是减少扫描的次数,在一次扫描中。完成多次insert操作。

--当前库下已有一张表student
select * from student;
--创建两张新表
create table student_insert1(sno int);
create table student_insert2(sname string);
--多重插入
from student
insert overwrite table student_insert1
select num
insert overwrite table student_insert2
select name;

2.4 dynamic partition insert(动态分区)

2.4.1 概述

  1. 动态分区插入指的是:分区的值是由后续的select查询语句的结果来动态确定的。
  2. 根据查询结果自动分区。动态分区将最后一个字段作为分区

2.4.2 配置参数

在这里插入图片描述

set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode = nonstrict;
<property><name>hive.exec.dynamic.partition</name><value>true</value><description>Whether or not to allow dynamic partitions in DML/DDL.</description>
</property>
<property><name>hive.exec.dynamic.partition.mode</name><value>strict</value><description>In strict mode, the user must specify at least one static partitionin case the user accidentally overwrites all partitions.In nonstrict mode all partitions are allowed to be dynamic.
</description>

2.4 insert Directory(导出数据)

2.4.1 概述

Hive支持将select查询的结果导出成文件存放在文件系统中。语法格式如下
注意:导出操作是一个OVERWRITE覆盖操作,慎重。

2.4.2 语法

  1. 目录可以是完整的URI。如果未指定scheme,则Hive将使用hadoop配置变量fs.default.name来决定导出位置;
  2. 如果使用LOCAL关键字,则Hive会将数据写入本地文件系统上的目录;
  3. 写入文件系统的数据被序列化为文本,列之间用\001隔开,行之间用换行符隔开。如果列都不是原始数据类型,那么这些列将序列化为JSON格式。也可以在导出的时候指定分隔符换行符和文件格式。
    标准语法
INSERT OVERWRITE [LOCAL] DIRECTORY directory1[ROW FORMAT row_format] [STORED AS file_format]
SELECT ... FROM ...

多重多出

FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] ...

导出格式

DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char][MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]

10.2.4.3 案例
导出到hdfs文件系统

insert overwrite directory '/tmp/hive_export/e1' select * from student;

在这里插入图片描述
导出时指定分隔符和文件存储格式

insert overwrite directory '/tmp/hive_export/e2' row format delimited fields terminated by ',' stored as orc select * from student;

导出数据到本地文件系统指定目录下

insert overwrite local directory '/root/data/e1' select * from student;

3 事务表

3.1 实现原理

3.1.1 概述

  1. Hive的文件是存储在HDFS上的,而HDFS上又不支持对文件的任意修改,只能是采取另外的手段来完成。
  2. 用HDFS文件作为原始数据(基础数据),用delta保存事务操作的记录增量数据;
    正在执行中的事务,是以一个staging开头的文件夹维护的,执行结束就是delta文件夹。每次执行一次事务操作都会有这样的一个delta增量文件夹;
  3. 当访问Hive数据时,根据HDFS原始文件和delta增量文件做合并,查询最新的数据。

3.1.2 目录

  1. INSERT语句会直接创建delta目录;
  2. DELETE目录的前缀是delete_delta;
  3. UPDATE语句采用了split-update特性,即先删除、后插入;

3.1.3 命名格式

  1. delta_minWID_maxWID_stmtID,即delta前缀、写事务的ID范围、以及语句ID;删除时前缀是delete_delta,里面包含了要删除的文件;
  2. Hive会为写事务(INSERT、DELETE等)创建一个写事务ID(Write ID),该ID在表范围内唯一;
  3. 语句ID(Statement ID)则是当一个事务中有多条写入语句时使用的,用作唯一标识。

3.1.4 delta目录下的文件

每个事务的delta文件夹下,都有两个文件:
在这里插入图片描述

  1. _orc_acid_version的内容是2,即当前ACID版本号是2。和版本1的主要区别是UPDATE语句采用了split-update特性,即先删除、后插入。这个文件不是ORC文件,可以下载下来直接查看。
  2. bucket_00000文件则是写入的数据内容。如果事务表没有分区和分桶,就只有一个这样的文件。文件都以ORC格式存储,底层二级制,需要使用ORC TOOLS查看,详见附件资料。

3.1.5 bucket 文件

在这里插入图片描述

  1. operation:0 表示插入,1 表示更新,2 表示删除。由于使用了split-update,UPDATE是不会出现的,所以delta文件中的operation是0 , delete_delta 文件中的operation是2。
  2. originalTransaction、currentTransaction:该条记录的原始写事务ID,当前的写事务ID。
  3. rowId:一个自增的唯一ID,在写事务和分桶的组合中唯一。
  4. row:具体数据。对于DELETE语句,则为null,对于INSERT就是插入的数据,对于UPDATE就是更新后的数据。

3.1.5 合并器

在这里插入图片描述

3.2 局限性

在这里插入图片描述

3.3 创建使用

--Hive中事务表的创建使用
--1、开启事务配置(可以使用set设置当前session生效 也可以配置在hive-site.xml中)
set hive.support.concurrency = true; --Hive是否支持并发
set hive.enforce.bucketing = true; --从Hive2.0开始不再需要  是否开启分桶功能
set hive.exec.dynamic.partition.mode = nonstrict; --动态分区模式  非严格
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; --
set hive.compactor.initiator.on = true; --是否在Metastore实例上运行启动压缩合并
set hive.compactor.worker.threads = 1; --在此metastore实例上运行多少个压缩程序工作线程。
--2、创建Hive事务表
create table trans_student(id int,name String,age int
) stored as orc TBLPROPERTIES('transactional'='true');

4 update、delete

只有事务表才可以更新删除。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 高德地图POI信息爬取代码详解

1. 函数要点整理 get_amap_poi(city, keywords, page) 这个函数旨在从高德地图中提取指定城市的POI&#xff08;Point of Interest&#xff09;信息。以下是函数的参数和返回值说明&#xff1a; 参数&#xff1a; city: 城市名称&#xff0c;指定要搜索的城市。keywords: 关键…

如何正确选择高速探头

最近看到一篇关于高速探头在DDR5测试中的应用文章&#xff0c;才发现探头的架构原来大有讲究&#xff0c;远远不是简单地带宽越高效果越好&#xff0c;而是需要根据测试对象进行合理地选择。 与示波器一起使用的高频电压探头会对其所连接的电路产生各种类型的负载效应&#xff…

Linux5.3、进程替换

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 替换原理 替换函数 函数解释 替换原理 当一个进程调用进程替换函数时&#xff0c;该进程的数据和代码完全被新程序的代码和数据所代替&#xff0c;而后重新构建页表的映射关系&#xff0c;进程还是之前的进程&#…

什么是SPEC基准测试?

SPEC服务器应用性能测试是一个全面衡量Web应用中java企业应用服务器性能的基础测试。 SPEC(the Standard Performance Evaluation Corporation标准性能评估机构)是一个全球性的、权威的第三方应用性能测试组织&#xff0c;它旨在确立、修改以及认定一系列服务器应用性能评估的…

SpringBoot配置mysql加密之Druid方式

一、导入Druid依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.22</version> </dependency>二、生成密文 方式1. 找到存放druid jar包的目录 1-1、在目录…

【企业转型】以企业架构为中心的SABOE数字化转型五环法

01 传统企业数字化转型面临诸多挑战 即将过去的2023年&#xff0c;chatGPT大模型、数据资产入表等事件的发生&#xff0c;标志着数字经济正在加速发展。数字经济是人类社会继农业经济、工业经济之后的第三种经济形态&#xff0c;将推动生产方式、生活方式和治理方式深刻变革&a…

Java研学-JavaScript 进阶

一 JS 的 DOM 1 概述 DOM 是 Document Object Model 文档对象模型的缩写。根据 W3C 的 DOM 规范&#xff0c;它是一种与浏览器&#xff0c;平台&#xff0c;语言无关的接口&#xff0c;能够动态地修改 XML 和 HTML。   D&#xff1a;文档 – HTML文档 或 XML 文档   O&…

CSS学习笔记整理

CSS 即 层叠样式表/CSS样式表/级联样式表&#xff0c;也是标记语言&#xff0c; 用于设置HTML页面中的文本内容&#xff08;字体、大小、对齐方式等&#xff09;、图片的外形&#xff08;宽高、边框样式、边距&#xff09;以及版面的布局和外观显示样式 目录 准备工作 Chrome调…

基于FPGA的温度控制系统设计(论文+源码)

1.系统设计 本次基于FPGA的智能温度控制系统&#xff0c;以FPGA为控制核心&#xff0c;采用自顶向下的设计方法&#xff0c;按照模块化设计的思路分别实现各个模块&#xff0c;再加以整合实现整个系统&#xff0c;从而达到了温度控制的目的。系统以水箱为被控对象&#xff0c;…

环境搭建及源码运行_java环境搭建_redis安装

书到用时方恨少、觉知此时要躬行&#xff1b;拥有技术&#xff0c;成就未来&#xff0c;抖音视频教学地址&#xff1a;​​​​​​​ ​​​​​​​​​​​​​​ 1、redis 介绍 后面会有精讲redis部分&#xff0c;此部分内容着重在redis环境的搭建 Redis&#xff08;Remot…

如何让.NET应用使用更大的内存

我一直在思考为何Redis这种应用就能独占那么大的内存空间而我开发的应用为何只有4GB大小左右&#xff0c;在此基础上也问了一些大佬&#xff0c;最终还是验证下自己的猜测。 操作系统限制 主要为32位操作系统和64位操作系统。 每个进程自身还分为了用户进程空间和内核进程空…

怎么选择合适的3ds Max云渲染农场?

3ds Max 用户日常面临的一个共同挑战便是漫长的渲染周期。作为一个强大的三维建模和渲染软件&#xff0c;3ds Max 势必需处理大量的光照、材质和阴影计算任务&#xff0c;因此&#xff0c;良好的渲染方案对从业者而言尤为重口。 一、为何考虑3ds Max云渲染? 云渲染成为了解决…