Hive3 - HiveSQL 特征及操作

news2024/11/25 2:58:34

一、HiveSQL特征

Hive SQL(HQL)SQL的语法大同小异,基本上是相通的,对SQL掌握的可以非常快的上手使用Hive SQL。不过在一些细节上需要特别注意Hive自己特有的语法知识点,下面分别进行介绍。

1. 字段数据类型

Hive数据类型整体分为两个类别:原生数据类型(primitive data type)和复杂数据类型(complex data type)。

原生数据类型包括:tinyint,smallint,int,bigint,float,double,boolean,string,timestamp,binary

复杂数据类型包括:array数组、map映射、struct结构、union联合体

create table test_xbc(
    id int comment "ID",
    name string comment "名称"
) comment "测试表";

注意点:Hive 对英文字母大小写不敏感,如果定义的数据类型和文件不一致,会尝试隐式转换,但是不保证成功。

2. SerDe 序列化方式

Serializer、Deserializer的简称,目的是用于在读写数据时的序列化和反序列化,其中 Hive 在读取文件时,会首先调用InputFormat(默认TextInputFormat),返回一条一条 kv 键值对记录(默认是一行对应一条记录)。然后调用SerDe(默认LazySimpleSerDe)的Deserializer,将一条记录中的value根据分隔符切分为各个字段。在写文件时,首先调用SerDe(默认LazySimpleSerDe)的Serializer将对象转换成字节序列,然后调用OutputFormat将数据写入HDFS文件系统中。

既然默认的是LazySimpleSerDe,那就肯定可以指定其他的类来处理,Hive 在建表的时候可以通过 row format 关键字指定该参数,如果指定delimited表示使用默认的LazySimpleSerDe类来处理数据。

create table test_xbc1(
    id int comment "ID",
    name string comment "名称"
) comment "测试表"
row format delimited 

如果指定其他类来处理,可以使用serde来指定,比如:

row format serde 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'

这里的serde 还支持用户自定义SerDe类。

3. 字段分隔符

Hive 数据存储在 HDFS 文件系统中,字段与字段之间想分隔开就需要定义分隔符,建表时如果没有 row format 语法指定分隔符。此时字段之间默认使用的ascii编码的分割符 \001

如果修改分隔符可以使用 fields terminated bylines terminated by 指定列和行之间的分隔符

create table test_xbc2(
    id int comment "ID",
    name string comment "名称"
) comment "测试表"
row format delimited 
fields terminated by ',' 
lines terminated by '\n' 

除了行和列,还支持集合元素之间分隔,Map元素分隔符,比如下面数据类型:

1,小明,西瓜:20;香蕉:18;橙子:10

分别标识 ID、姓名、购买水果及价格, 前两个都是基础类型,后面的属于 Map 类型,此时就需要设定集合元素之间分分隔符和Map元素的分隔符:

create table test_xbc3(
    id int,
    name string,
    buy_fruits map<string,int>
)
row format delimited
fields terminated by ','
collection items terminated by ';'
map keys terminated by ':' ;

在这里插入图片描述

4. 建表时指定存储目录

Hive创建表默认存储路径是由 hive-site.xml配置文件中的hive.metastore.warehouse.dir属性指定的。默认是:/user/hive/warehouse,如果创建的表已存在数据,并且数据存在其他位置,可以通过location更改数据的存储位置:

create table test_xbc3(
    id int comment "ID",
    name string comment "名称"
) 
row format delimited
fields terminated by ','
lines terminated by '\n' 
location '/data/data1'

创建测试下面数据 test_xbc3.txt

1,张三
2,李四
3,王五

将数据上传至 /data/data1 下:

hadoop fs -put test_xbc3.txt /data/data1/

查询数据:

select * from test_xbc3;

在这里插入图片描述

5. 内、外部表

Hive 中表可分为内部表和外部表,内部表也称为被Hive拥有和管理的托管表。默认情况下创建的表就是内部表,Hive拥有该表的结构和文件,删除内部表时,它会删除数据以及表的元数据。外部表只管理表元数据的生命周期,其中的数据不归 Hive 拥有或管理,删除外部表只会删除元数据,而不会删除实际数据。

通过 describe formatted tableName; 可以获取表的描述信息,其中 Table Type 标明了表的类型:
在这里插入图片描述
默认就是内部表,如果需要创建外部表,则需要使用 需要使用external关键字:

create external table test_xbc4(
    id int,
    name string
)
row format delimited
fields terminated by ','
lines terminated by '\n'
location '/data/data2';

创建测试下面数据 test_xbc4.txt

1,张三
2,李四
3,王五

将数据上传至 /data/data2 下:

hadoop fs -put test_xbc4.txt /data/data1/

查询数据:

select * from test_xbc4;

在这里插入图片描述
删除表 test_xbc4

drop table test_xbc4;

HDFS中查看可以发现数据依然存在:

在这里插入图片描述

6. Hive分区表

Hive表的数据量大、文件多时,为了避免查询时全表扫描数据,Hive支持根据用户指定的字段进行分区,分区的字段可以是日期、地域、种类等具有标识意义的字段。根据标识字段快速定位数据分区,尽可能避免了全表扫描查询。

创建分区表的语法:

create table table_name (column1 data_type, column2 data_type) partitioned by (partition1 data_type, partition2 data_type,.);

比如有下面三个文件数据,分别字段表示:ID、姓名、地区

1,小明,jiangsu
2,小李,jiangsu
3,小红,jiangsu
4,小兰,jiangsu
5,张三,jiangsu
6,李四,jiangsu
7,王五,shandong
8,赵六,shandong
9,诸葛亮,shandong
10,曹操,shandong
11,关羽,shandong
12,周瑜,shandong
13,荆轲,beijing
14,嬴政,beijing
15,后羿,beijing

因此,可以创建分区表,根据地区字段分区:

create table test_xbc5(
       id int,
       name string,
       area_name string
) 
partitioned by (area string)
row format delimited
fields terminated by ","
lines terminated by '\n';

注意:分区字段不能是表中已经存在的字段,因为分区字段最终也会以虚拟字段的形式显示在表结构上。

手动加载分区数据,将上面三个数据上传至 HDFS 中:

在这里插入图片描述

静态分区

加载数据,load 命令说明在下面第 10 点:

load data inpath '/data/data/jiangsu.txt' into table test_xbc5 partition(area="jiangsu");

load data inpath '/data/data/shandong.txt' into table test_xbc5 partition(area='shandong');

load data inpath '/data/data/beijing.txt' into table test_xbc5 partition(area='beijing');

查询数据:

在这里插入图片描述

动态分区:

动态分区指的是分区的字段值是基于查询结果自动推断出来的,需要在hive会话中设置两个参数:

set hive.exec.dynamic.partition=true;

set hive.exec.dynamic.partition.mode=nonstrict;

其中hive.exec.dynamic.partition.mode分为nonstick非严格模式和strict严格模式。strict严格模式要求至少有一个分区为静态分区。

创建另一张分区表:

create table test_xbc6(
       id int,
       name string,
       area_name string
) 
partitioned by (area string)
row format delimited
fields terminated by ","
lines terminated by '\n';

写入分区数据:

insert into table test_xbc6 partition(area) select * from test_xbc5 ;

查询数据:

在这里插入图片描述

查看 HDFS 存储接口:

在这里插入图片描述

7. Hive分桶表

分桶表也叫做桶表,是一种用于优化查询而设计的表类型。该功能可以让数据分解为若干个部分进行存储,在查询时可以减少全表扫描,JOIN时也可以提高MR程序效率,减少笛卡尔积数量。

在分桶时,我们要指定根据哪个字段分桶,分桶的个数。默认规则是:Bucket number = hash_function(bucketing_column) mod num_buckets。 桶编号相同的数据会被分到同一个桶当中。

分桶表的语法:

create [external] table [db_name.]table_name
[(col_name data_type, ...)]
clustered by (col_name)
into n buckets;

clustered by (col_name) 表示根据哪个字段进行分,注意字段必须是表中已经存在的字段。into n buckets 表示分为几个桶。

比如有如下数据,根据 ID 分成 3 个桶。

1,小明,jiangsu
2,小李,jiangsu
3,小红,jiangsu
4,小兰,jiangsu
5,张三,jiangsu
6,李四,jiangsu
7,王五,shandong
8,赵六,shandong
9,诸葛亮,shandong
10,曹操,shandong
11,关羽,shandong
12,周瑜,shandong

首先先创建一个普通表,将数据加载进来:

create table test_xbc7(
       id int,
       name string,
       area_name string
) 
row format delimited
fields terminated by ","
lines terminated by '\n';

将数据上传至 HDFS 中的 /user/hive/warehouse/test.db/test_xbc7/下。

然后创建分桶表:

create table test_xbc8(
       id int,
       name string,
       area_name string
) 
clustered by(id) into 3 buckets
row format delimited
fields terminated by ','
lines terminated by '\n';

写入分桶表数据:

insert into test_xbc8 select * from test_xbc7;

查询分桶表数据:

在这里插入图片描述

查看 HDFS 存储格式:
在这里插入图片描述

8. Hive事务表

Hive0.14版本开始,具有了 ACID 语义的事务,在此之前的版本中是不支持事务的,Hive 0.14 后 ,也增加了 INSERT,UPDATE和 DELETE 操作,不过 UPDATE和 DELETE 只能在事务表上才可以操作。

事务表的局限性

  • 不支持BEGIN、COMMIT、ROLLBACK操作,所有操作都是自动提交。
  • 仅支持ORC文件格式(STORED AS ORC)。
  • 默认事务为关闭状态,需要配置开启使用。
  • 表必须是分桶表(Bucketed)。
  • 表参数transactional必须为true
  • 外部表不能成为ACID表,不允许从非ACID会话读取/写入ACID表。

在使用事务表前需要开启以下配置,也可以在 hive-site.xml 永久配置

--支持并发
set hive.support.concurrency = true; 
 --开启分桶功能
set hive.enforce.bucketing = true;
--动态分区模式为非严格
set hive.exec.dynamic.partition.mode = nonstrict; 
--事务管理器
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; 
-- 在Metastore实例上运行启动线程和清理线程
set hive.compactor.initiator.on = true; 
-- metastore实例上运行多少个压缩程序工作线程。
set hive.compactor.worker.threads = 1; 

创建事务表:

create table test_xbc8(
       id int,
       name string,
       area_name string
) 
clustered by(id) into 3 buckets
row format delimited
fields terminated by ','
lines terminated by '\n'
stored as orc 
tblproperties('transactional'='true');

写入数据:

insert into test_xbc8 values(1,'小明');
insert into test_xbc8 values(2,'张三');

在这里插入图片描述

修改数据

update test_xbc8 set name = '李四' where id = 2;

在这里插入图片描述

删除数据:

delete from test_xbc8  where id = 1;

在这里插入图片描述

9. Hive视图

Hive的视图同MySQL中的视图一致,是一种虚拟表,只保存定义,不实际存储数据。

创建视图:

create view test_xbc5_view as 
select * from test_xbc8 where area_name = 'jiangsu';

10. load 加载数据

将本机或HDFS中的文件加载到表中,加载过程Hive不会进行任何转换,只是数据文件移动到与Hive表对应的位置下。

语法:

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)

local:如果不加 local 则去HDFS中找相关路径,如果加 local 则是去HiveServer2服务所在主机系统文件中查找。
filepath:待移动数据的路径
overwrite:如果加了overwrite则目标表(或者分区)中的内容会被删除,然后再添加新的数据。

加载本地数据至 test_xbc5 表:

load data local inpath '/data/data/test_xbc5.txt' into table test_xbc5;

加载HDFS中的数据至test_xbc5 表:

load data inpath '/data/data/test_xbc5.txt' into table test_xbc5;

加载HDFS中的数据至test_xbc5 表的某个分区:

load data inpath '/data/data/test_xbc5.txt' into table test_xbc5 partition(area="jiangsu");

Hive 3.0及更高版本中当最后一个字段是分区字段时,并且前面的字段可以和表的字段对应上,load 时可以不指定分区,自动转换成为insert as select语句加载数据,例如有下面数据:

1,小明,jiangsu
2,小李,jiangsu
3,小红,jiangsu
4,小兰,jiangsu
5,张三,jiangsu
6,李四,jiangsu
7,王五,shandong
8,赵六,shandong
9,诸葛亮,shandong
10,曹操,shandong
11,关羽,shandong
12,周瑜,shandong
13,荆轲,beijing
14,嬴政,beijing
15,后羿,beijing

创建分区表:

create table test_xbc9(
       id int,
       name string
) 
partitioned by (area string)
row format delimited
fields terminated by ","
lines terminated by '\n';

加载上面示例数据:

load data inpath '/data/data/test_xbc9.txt' into table test_xbc9;

在这里插入图片描述
查看 HDFS 中的存储结构:

在这里插入图片描述

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

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

相关文章

【附源码】Python计算机毕业设计烹饪课程预约系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

电脑重装系统c盘如何备份资料

现在越来越多的用户都喜欢重装自己所喜欢的电脑系统&#xff0c;但需要在重新安装系统之前备份自己的电脑。因此有很多用户问重装系统c盘如何备份的文件。今天小编就教下大家重装系统c盘如何备份的教程。 工具/原料&#xff1a; 系统版本&#xff1a;windows7系统 品牌型号&…

多目标应用:非支配排序的鲸鱼优化算法NSWOA优化RBF神经网络实现数据预测(RBF隐藏层神经元个数可以自行设定)

一、非支配排序的鲸鱼优化算法 非支配排序的鲸鱼优化算法&#xff08;Non-Dominated Sorting Whale Optimization Algorithm&#xff0c;NSWOA&#xff09;由Pradeep Jangir和 Narottam Jangir于2017年提出。 NSWOA算法流程如下&#xff1a; 二、RBF神经网络 1988年&#xf…

Spring-Aop面向切面编程

文章目录一、简介1、作用2、AOP核心概念3、五种&#xff08;增强&#xff09;通知类型二、AOP入门小案例&#xff08;注解版&#xff09;1.导入坐标(pom.xml)2.制作连接点(原始操作&#xff0c;Dao接口与实现类)3:定义通知类和通知4:定义切入点5:制作切面6:将通知类配给容器并标…

Linux操作系统

Linux 基础入门 Linux操作系统 操作系统 首先&#xff0c;我们需要知道什么是操作系统&#xff1a; 操作系统是应用程序运行的基础支撑环境操作系统作用是管理与控制计算机系统硬件与软件资源&#xff08;软件与硬件的中间层&#xff09;Intel X86 架构上的常见的操作系统&…

linux基本指令(上)

文章目录1.whomai指令2. pwd指令3. ls 指令1. ls指令2. ls -l指令3.ls -la指令1. cd .2. cd . .4. ls -ld指令5. ls -i指令1. windows 与linux标识文件之间的区别6. ls -R指令4. cd指令1.cd 指令2. cd ~ 指令3.cd -指令5. 根目录1.绝对路径2.相对路径例判断相对路径是否唯一6. …

leetcode-每日一题-119-杨辉三角2(简单,dp)

今天这道题是一道简单的dp题说实话很好想到解法&#xff0c;就是用两个dp来回倒换即可解除&#xff0c;然后也没啥难度所以就不解释了&#xff0c;养成一个好习惯就是设置数组的时候需要malloc动态获取即可&#xff0c;然后使用memset进行初始化&#xff0c;注意memset只能进行…

期货行权(期货行权日)

​ 期权如何行权&#xff1f;期货到期了如何进行实物交割&#xff1f; 期权到期日 Expiration Date&#xff1a;到期日即是指期权合约所规定的&#xff0c;期权购买者可以实际执行该期权的最后日期。 对欧式期权而言&#xff0c;为期权合约可以行权的唯一一天&#xff1b;对…

[附源码]计算机毕业设计JAVAjsp心理测评系统

[附源码]计算机毕业设计JAVAjsp心理测评系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis…

经典图割算法中图的构建及实现:Graph-Cut

经典图割算法中图的:Graph-Cut一&#xff0e;graph-cut&#xff1a;准则函数二&#xff0e;Graph-cut&#xff1a;图的建立1.术语&#xff1a;2.图的建立3. 头文件4. 源文件5. 测试图像讲解目前典型的3种图割算法&#xff1a;graph-cut、grab-but、one-cut。本文主要讲解graph-…

【IEEE2014】EET:基于采样的机器人运动规划中的平衡勘探与开发

EET&#xff1a;基于采样的机器人运动规划中的平衡勘探与开发 摘要&#xff1a; 本文提出了一种用于运动规划的探索/利用树&#xff08;EET&#xff09;算法。EET规划者故意用概率的完整性来换取计算效率。这种权衡使EET规划器能够比最先进的基于采样的规划器多三个数量级。我们…

【蓝桥杯真题练习】STEMA科技素养练习题库 答案版013 持续更新中~

1、人工神经网络是一种模仿动物神经系统设计的机器学习方法,它被用于解决各种传统编程无法解决的问题。“神经网络”一词在英文中是( )。 A.Neural Network B.Neural Engine C.Machine Learning D.Machine Network 答案:A 2、中央处理器(CPU)是手机,电脑…

第五章 Docker 自定义镜像

5-1 认识 Dockerfile 文件 Dockerfile 用于构建 Docker 镜像&#xff0c;Dockerfile 文件是由一行行命令语句组 成 &#xff0c; 基于 这些命 令 即 可以构建一 个镜 像&#xff0c; 比如下面 就 是一 个 Dockefile 文件样例&#xff1a; FROM XXX/jdk:8 MAINTAINER docker_us…

大一学生《Web编程基础》期末网页制作 HTML+CSS+JavaScript 企业网页设计实例

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【紧急情况】:回宿舍放下书包的我,花了20分钟敲了一个抢购脚本

文章目录情况紧急 ⁉️抢❗️抢❗️抢❗️开抢时间说明&#x1f4a8;开抢过程&#x1f4a5;Get_cookie.py开抢结束语&#x1f631;情况紧急 ⁉️ 不管你信不信&#xff0c;这就是俺刚瞧出的代码&#xff01;&#xff01;&#xff01; 现在离20&#xff1a;00还有38分钟&#xf…

持久与速度 鱼和熊掌 MySQL怎么去兼得

前言 我们都知道 MySQL 有一个特性就是持久化储存到磁盘中 我们存进去就要取出来这也是MySQL的速度为什么比不上Redis。但是MySQL 并不是完全就摆烂每次都进行 Select update 的时候都重新去磁盘IO 这样MySQL肯定会更慢 速度快 和 持久化 MySQL 表示我都要 但是两者都要肯定没…

Chapter7.4:线性离散系统的分析与校正考研参考题

此系列属于胡寿松《自动控制原理题海与考研指导》(第三版)习题精选&#xff0c;仅包含部分经典习题&#xff0c;需要完整版习题答案请自行查找&#xff0c;本系列属于知识点巩固部分&#xff0c;搭配如下几个系列进行学习&#xff0c;可用于期末考试和考研复习。 自动控制原理(…

台式万用表究竟如何选型?手持式和台式选择哪一个?

数字万用表是一种多用途的电子测量仪器&#xff0c;有各种各样的形状和规格&#xff0c;可能要超过任何其他仪器品类&#xff0c;比较常见的就是手持和台式万用表了&#xff0c;那么在选型时选择手持式还是台式万用表呢?今天安泰测试就给大家分享一下&#xff1a; 手持式数字万…

充分复用离线空闲算力,降低了实时计算资源开支

针对提供下游数据报表展示的场景&#xff0c;一般需要走预计算的流程将结果持久化下来&#xff0c;对数据就绪和计算耗时的敏感度都较高&#xff0c;而且查询逻辑相对复杂&#xff0c;Trino/Impala 集群规模相对较小&#xff0c;执行容易失败&#xff0c;导致稳定性欠佳。这个场…

Linux系统中标准输入设备的控制实现

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用标准输入设备&#xff0c;进行控制信息的识别。 目录 第一&#xff1a;按键应用编程方法 第二&#xff1a;单点触摸应用程序实现 ​第三&#xff1a;多点触摸应用程序实现 第一&#xff1a;按键应用编程方法 编写…