Hive的分区和排序

news/2024/11/13 21:48:58/文章来源:https://www.cnblogs.com/ndmtzwdx/p/18544409

一、Hive的分区(十分重要)

1、分区是什么
答:我们可以把一个大的文件分隔成一个个小的文件,这样每次操作一个小文件就很方便了
2、为什么要进行分区
答:通过分区,当我们查询的时候,可以只扫描与条件相关的分区,这样做,避免了全局扫描,加快查询速度

1、静态分区(SP)

静态分区指的是,在我们将数据上传到hdfs上的时候,进行手动分区,例如

静态分区(单分区)

创建表时:
CREATE TABLE IF NOT EXISTS t_student (
sno int,
sname string
) partitioned by(grade int)
row format delimited fields terminated by ',';
与平常建表不同,在静态分区建表的时候需要指定字段,但是这个字段不能和表字段相同

将数据放到hdfs上的时候,需要指定分区
load data local inpath '/usr/local/soft/bigdata32/data/stu1.txt' into table t_student partition(grade=1);
load data local inpath '/usr/local/soft/bigdata32/data/stu2.txt' into table t_student partition(grade=2);
load data local inpath '/usr/local/soft/bigdata32/data/stu3.txt' into table t_student partition(grade=3);
load data local inpath '/usr/local/soft/bigdata32/data/stu4.txt' into table t_student partition(grade=5);
将stud1的数据放到grade1这个分区中去...

2、静态分区(多分区)

create table if not exists t_teacher (
tno int,
tname string
) partitioned by(grade int,clazz int)
row format delimited fields terminated by ',';
指定多个分区字段

向hdfs上载入数据
load data local inpath '/usr/local/soft/bigdata32/data/t1.txt' into table t_teacher partition(grade=1,clazz=1);
load data local inpath '/usr/local/soft/bigdata32/data/t2.txt' into table t_teacher partition(grade=1,clazz=2);
load data local inpath '/usr/local/soft/bigdata32/data/t3.txt' into table t_teacher partition(grade=1,clazz=3);
load data local inpath '/usr/local/soft/bigdata32/data/t4.txt' into table t_teacher partition(grade=2,clazz=1);
load data local inpath '/usr/local/soft/bigdata32/data/t5.txt' into table t_teacher partition(grade=2,clazz=2);
需要指定两个分区编号,相当于嵌套关系

3、查询语句

select count(*) from t_student where grade=1

查看分区
show partition t_teacher;

2、动态分区(DP)

什么是动态分区?
答:动态分区通过数据来进行判断,并且动态分区只有在sql执行时才能决定

1、开启动态分区

设置能够进行动态分区
set hive.exec.dynamic.partition=true;
将分区改为不严格的
set hive.exec.dynamic.partition.mode=nonstrict;

2、构建动态分区

--创建分区表
CREATE TABLE IF NOT EXISTS t_student_d (
sno int,
sname string
) partitioned by (grade int,clazz int)
row format delimited fields terminated by ',';

--创建外部表
CREATE EXTERNAL TABLE IF NOT EXISTS t_student_e (
sno int,
sname string,
grade int,
clazz int
)
row format delimited fields terminated by ','
location "/bigdata29/teachers";

数据:
1,xiaohu01,1,1
2,xiaohu02,1,1
3,xiaohu03,1,1
4,xiaohu04,1,2
5,xiaohu05,1,2
6,xiaohu06,2,3
7,xiaohu07,2,3
8,xiaohu08,2,3
9,xiaohu09,3,3
10,xiaohu10,3,3
11,xiaohu11,3,3
12,xiaohu12,3,4
13,xiaohu13,3,4
14,xiaohu14,3,4
15,xiaohu15,3,4
16,xiaohu16,4,4
17,xiaohu17,4,4
18,xiaohu18,4,5
19,xiaohu19,4,5
20,xiaohu20,4,5
21,xiaohu21,4,5

指定分区字段
insert overwrite table t_student_d partition (grade,clazz) select * from t_student_e;
结果会将数据自动的进行分区

3、动态分区的优缺点

优点:不用手动指定了,自动的会对数据进行分区
缺点:可能会发生数据倾斜

二、Hive的分桶

1、什么是分桶

答:分桶是将一个大的文件分成一个个小的文件进行存储

2、分桶的原理

答:对列进行哈希,然后除以桶的个数进行取余,这样就决定了数据该放在哪个桶里

3、进行分桶的操作

1、先开启分桶的支持

set hive.enforce.bucketing=ture;

2、创建一个表

create table person
(
id int,
name string,
age int
)
row format delimited
fields terminated by ',';

3、将数据导到这张表中去

load data local inpath '/usr/loacl/soft/bigdata32/data/1.txt' into table person;

4、创建分桶表

create table psn_bucket
(
id int,
name string,
age int
)
clustered by(age) into 4 buckets
row format delimited fields terminated by ',';

5、将数据insert到分桶表中去

insert into psn_bucket select * from person;

三、Hive JDBC

1、新建maven项目并导入依赖

2、编写JDBC

四、Hive查询语句

1、全局排序

order by 就是全局排序,因此只有一个reduce,会导致当数据规模较大的时候,查询结果过慢
order by 后面可以跟 参数,如果不跟就默认为升序,如果加上desc就表示降序

2、局部排序

sort by 是在数据进入reduce之前进行排序,他只能保证数据局部有序

设置reduce的个数

set mapreduce.job.reduces=3;

查看reduce的个数

set mapreduce.job.reduce;

分区排序

distribute by
根据指定的字段将数据分到不同的reducer
一般结合sort by使用,但是要在sort by之前

分区并排序

cluster by 只能默认升序,不能使用倒序
能确保将指定列具有相同值的行分组在一起

五、Hive的内置函数

进多出一

select *,concat_ws(':',collect_set(列名))as 别名 from 表名 group by id;

进一出多

需要对一个数据进行拆分
select explode(split(列名,“数据分隔符”)) from 表名

lateral view 表生成函数,可以将explode的数据生成一个列表
数据:
1,这个杀手不太冷,剧情-动作-犯罪
2,七武士,动作-冒险-剧情
3,勇敢的心,动作-传记-剧情-历史-战争
4,东邪西毒,剧情-动作-爱情-武侠-古装
5,霍比特人,动作-奇幻-冒险
通过如下sql将数据变成下面的形式(将一列变成多行)
select id,name from t_movie1 lateral view explode(split(types,"-")) typetable as type;
1,这个杀手不太冷,剧情
1,这个杀手不太冷,动作
1,这个杀手不太冷,犯罪
2,七武士,动作
2,七武士,冒险
2,七武士,剧情
3,勇敢的心,动作
3,勇敢的心,传记
3,勇敢的心,剧情
3,勇敢的心,历史
3,勇敢的心,战争
4,东邪西毒,剧情
4,东邪西毒,动作
4,东邪西毒,爱情
4,东邪西毒,武侠
4,东邪西毒,古装
5,霍比特人,动作
5,霍比特人,奇幻
5,霍比特人,冒险
就是这在id,name字段后面再加上拆分出来的数据

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

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

相关文章

项目冲刺4-3

仓库地址:https://github.com/bitpurleclude/GDUT-Goofish.git这个作业属于哪个课程 (https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/join?id=CfDJ8AOXHS93SCdEnLt5HW8VuxT_rAhbZKO3TfjMmbv1B0Re5Fp2d0_QACha2ZoYZ4fxF-ZKCCAhfJl7B8mvCfesLYE02X8T6kx_2R8w0SR-ykrgDVRKW…

【Linux】git note -v command not found

安装note.js Node.Js中文网 『Win+E』『此电脑』右键点击『属性』『高级系统设置』-『环境变量』『系统变量』-『NOTE_PATH』“C:\Program Files\nodejs”『用户变量』-『Path』“C:\Program Files\nodejs”『Win+R』重新启动控制台『cmd』-“$NOTE -v” 双击重新启动『Git Ba…

2024.11.13 DP题单

录制唱片 你刚刚继承了流行的 “破锣摇滚” 乐队录制的尚未发表的 \(N\)(\(1\leq N\leq 20\))首歌的版权。你打算从中精选一些歌曲,发行 \(M\)(\(1\leq M\leq 20\))张 CD。每一张 CD 最多可以容纳 \(T\)(\(1\leq T\leq 20\))分钟的音乐,一首歌不能分装在两张 CD 中。CD…

基于HASM模型的高精度建模matlab仿真

1.程序功能描述 本课题主要使用HASM进行高精度建模,主要对HASM模型进行介绍以及在实际中如何进行简化实现的。HASM原始的模型如下所示: 2.测试软件版本以及运行结果展示MATLAB2022A版本运行 3.核心程序%第一类基本变量E(i,j) = 1 + (( f(i,j+1,n) - f(i,j-1,n) )/( …

CICD04 Jenkins容器化CICD实现及分布式构建, 流水线Pipeline ubuntu使用

2.14.3 案例: 基于 Docker 插件实现自由风格任务实现 Docker 镜像 制作 不如前面的直接脚本编写灵活 2.14.3.2 安装插件 docker-build-step jenkins上安装 docker-build-step 插件#选择jenkins使用的docker服务 #左侧系统管理,右侧系统配置,Docker Builder下Docker URL输入 u…

数据类型和运算符

数据类型 动态类型编程语言运行时判断静态类型的编程语言 : Go 、C 、在开发的时候,就需要给一些定义的变量赋值空间大小。C 需要自己去开辟这个空间数据类型 : 每种在Go语言中出现的基本数据类型,会有一个默认的空间大小。 1、布尔类型数据 布尔型的值只可以是常量 true 或…

XXL JOB DockerCompose部署

官网给的方式是 Docker 命令启动,但是用起来太麻烦了,所以用DockerCompose 简化部署 创建数据库,导入 SQL SQL 脚本位置为/xxl-job/doc/db/tables_xxl_job.sql https://raw.githubusercontent.com/xuxueli/xxl-job/refs/heads/master/doc/db/tables_xxl_job.sql 编写 Docker…

CICD02 Jenkins安装,备份还原, 实现CICD核心功能 ubuntu使用

DevOps 之 CICD 服务器 Jenkins 1 Jenkins 部署与基本配置 1.2 Jenkins 安装和启动 1.2.1 Jenkins 的安装 Jenkins支持多种安装方法 1.包安装 2.JAVA的WAR文件 #要手动配置,不太方便 3.容器运行#系统要求 最低推荐配置:1.256MB可用内存2.1GB可用磁盘空间(作为一个Docker容…

CICD01 Git, GitLab, 部署方式 ubuntu使用

版本管理系统 Git 和 GitLab 1 DevOps 简介 1.3 持续集成、持续交付和持续部署 CICD CICD: 持续集成, 持续交付, 持续部署 1.6 常见的软件部署模式 生产中 蓝绿部署 和 金丝雀用的比较多 1.6.1 蓝绿部署 Blue-green Deployments 一个和生产环境一样的预发布环境, 和生产环…

jvm 垃圾回收算法的评价标准

如何实现回收的(核心思想): 1. 找到内存中存活的对象(与GC Root相关联) 2. 释放不再存活对象的内存,使得程序能再次利用这部分空间 --------------------------------------------------------------------------------- 垃圾回收算法的分类: -------- ----------------…

GO面试-切片

一、结构介绍 切片(Slice)在 Go 语言中,有一个很常用的数据结构,切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。并发不安全。 切片是一种引用类型,它有三个属性:指针,长度和容量。 底层源码定义: type slice …

系统管理体系——软件包管理

1.Linux系统管理体系——软件包管理Linux下面的软件包格式为:rpm格式(红帽系列系统,CentOS,麒麟系统)或deb格式(Debian,Ubuntu)安装软件方式 举例 说明 应用场景yum/apt 方式 点外卖,缺啥少啥,外卖解 决 通过网络下载软件包,替我们安装, 如果 有依赖自动下载依赖并安装. …