Hive的分区与排序

一、Hive分区

1.引入:

        在大数据中,最常见的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件,这样每次操作一个个小的文件就会很容易了,同样的道理,在hive当中也是支持这种思想的,就是我们可以把大的数据,按照每天或者每小时切分成一个个小的文件,这样去操作小的文件就会容易很多了。

2.优点:

避免全局搜索,减少数据扫描工作量,提高了查询效率。

3.静态分区(SP)

借助于物理的文件夹分区,实现快速检索的目的

一般对于查询比较频繁的列设置为分区列

需要手动插入或加载数据进行分区

创建单分区表语法:

CREATE TABLE IF NOT EXISTS t_student (
sno int,
sname string
) partitioned by(grade int)
row format delimited fields terminated by ',';

--  分区的字段不要和表的字段相同。相同会报错error10035


1,xiaohu01,1
2,xiaohu02,1
3,xiaohu03,1
4,xiaohu04,1
5,xiaohu05,1

6,xiaohu06,2
7,xiaohu07,2
8,xiaohu08,2

9,xiaohu09,3
10,xiaohu10,3
11,xiaohu11,3
12,xiaohu12,3
13,xiaohu13,3
14,xiaohu14,3
15,xiaohu15,3

16,xiaohu16,4
17,xiaohu17,4
18,xiaohu18,4
19,xiaohu19,4
20,xiaohu20,4
21,xiaohu21,4
-- 载入数据
-- 将相应年级依次导入
load data local inpath '/usr/local/soft/bigdata29/wendang/gread_data/grade1.txt' into table t_student partition(grade=1);

load data local inpath '/usr/local/soft/bigdata29/wendang/gread_data/grade2.txt' into table t_student partition(grade=2);

load data local inpath '/usr/local/soft/bigdata29/wendang/gread_data/grade3.txt' into table t_student partition(grade=3);

load data local inpath '/usr/local/soft/bigdata29/wendang/gread_data/grade4.txt' into table t_student partition(grade=4);

图示:

静态多分区表语法:

CREATE TABLE IF NOT EXISTS t_teacher (
tno int,
tname string
) partitioned by(grade int,clazz int)
row format delimited fields terminated by ',';

--注意:前后两个分区的关系为父子关系,也就是grade文件夹下面有多个clazz子文件夹。


1,xiaoge01,1,1
2,xiaoge02,1,1

3,xiaoge03,1,2
4,xiaoge04,1,2

5,xiaoge05,1,3
6,xiaoge06,1,3

7,xiaoge07,2,1
8,xiaoge08,2,1

9,xiaoge09,2,2

--载入数据
load data local inpath ''/usr/local/soft/bigdata29/wendang/gread_data/grade11.txt'' into table t_teacher partition(grade=1,clazz=1);

load data local inpath ''/usr/local/soft/bigdata29/wendang/gread_data/grade12.txt'' into table t_teacher partition(grade=1,clazz=2);

load data local inpath ''/usr/local/soft/bigdata29/wendang/gread_data/grade13.txt'' into table t_teacher partition(grade=1,clazz=3);

load data local inpath ''/usr/local/soft/bigdata29/wendang/gread_data/grade21.txt'' into table t_teacher partition(grade=2,clazz=1);

load data local inpath ''/usr/local/soft/bigdata29/wendang/gread_data/grade22.txt'' into table t_teacher partition(grade=2,clazz=2);

4.动态分区(DP)

  • 静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判断。

  • 详细来说,静态分区的列是在编译时期通过用户传递来决定的;动态分区只有在SQL执行时才能决定

开启动态分区首先要在hive会话中设置如下的参数:

# 表示开启动态分区
hive> set hive.exec.dynamic.partition=true;

# 表示动态分区模式:strict(需要配合静态分区一起使用)、nostrict
hive> set hive.exec.dynamic.partition.mode=nonstrict;

===================以下是可选参数======================

# 表示支持的最大的分区数量为1000,可以根据需求自己调整
hive> set hive.exec.max.dynamic.partitions.pernode=1000;

# 设置为true表示开启动态分区的功能(默认为false)
--hive.exec.dynamic.partition=true;

# 设置为nonstrict,表示允许所有分区都是动态的(默认为strict)
-- hive.exec.dynamic.partition.mode=nonstrict; 
-- hive.exec.dynamic.partition.mode=strict; 

# 每个mapper或reducer可以创建的最大动态分区个数(默认为100) 
比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错
--hive.exec.max.dynamic.partition.pernode=100; 

# 一个动态分区创建可以创建的最大动态分区个数(默认值1000)
--hive.exec.max.dynamic.partitions=1000;

# 全局可以创建的最大文件个数(默认值100000)
--hive.exec.max.created.files=100000; 

# 当有空分区产生时,是否抛出异常(默认false) 
-- hive.error.on.empty.partition=false;  

动态分区案例: 动态插入学生年级班级信息

--创建分区表
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 ',';

原始表数据:

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;

5.分区表操作

举例:

(1)全表扫描,不推荐,效率低

select count(*) from st_student_d;

(2)使用where条件进行分区裁剪,避免了全表扫描,效率高

select count(*) from st_student_d where grade = 1;

(3)也可以在where条件中使用非等值判断

select count(*) from t_student_d where grade<3 and grade>=1;

(4)查看分区

show partitions t_student_d;

(5)添加分区

alter table t_student_d add partition (grade=6);

(6)删除分区

alter table t_student_d drop partition (grade=5);

2.1 业务场景

数据分桶的适用场景:

二、Hive分桶

1.概述与使用场景

概述:在Hive中,分桶是一种用于提高查询性能的技术,通过将数据集分成更小的、可管理的部分来实现。分桶是通过对表的某一列进行哈希来实现的,Hive会根据分桶列的值来确定数据应该放入哪个桶。

使用场景:当我们的分区之后,最后的文件还是很大怎么办,就引入了分桶的概念。将这个比较大的文件再分成若干个小文件进行存储,我们再去查询的时候,在这个小范围的文件中查询就会快很多。对于hive中的每一张表、分区都可以进一步的进行分桶。当然,分桶不是说将文件随机进行切分存储,而是有规律的进行存储。

2.数据分桶原理

Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中

  • bucket num = hash_function(bucketing_column) mod num_buckets

  • 列的值做哈希取余 决定数据应该存储到哪个桶

3.数据分桶优势

方便抽样

使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便

提高join查询效率

获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

4.分桶案例:

(1)首先我们需要开启分桶的支持

set hive.enforce.bucketing=true; 

(2)创建一个普通的表

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

(3)数据准备(id,name,age)

1,tom,11
2,cat,22
3,dog,33
4,hive,44
5,hbase,55
6,mr,66
7,alice,77
8,scala,88

将数据load到person表中

load data local inpath '文件在Linux上的绝对路径' into table psn31;

(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到表psn_bucket中

insert into psn_bucket select * from person;

5.分桶和分区的区别

分区和分桶的区别在于其提供的性能优化方向不同。分区适用于数据快速访问特定的数据范围,而分桶适用于对于数据JOIN操作的效率提升。

分区之后会产生分区文件夹,数据会存储在问价夹下的文件中,分桶不会产生文件夹,数据直接存储在分桶之后的文件中。简而言之,分区是对数据进行划分,而分桶是对文件进行划分。

三、Java连接hive(Hive JDBC)

1.启动hiveserver2

    hiveserver2 &

2.新建maven项目并添加两个依赖

 <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.7.6</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc -->
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-jdbc</artifactId>
        <version>1.2.1</version>
    </dependency>

3.编写JDBC代码

import java.sql.*;public class HiveJDBC {public static void main(String[] args) throws ClassNotFoundException, SQLException {Class.forName("org.apache.hive.jdbc.HiveDriver");Connection conn = DriverManager.getConnection("jdbc:hive2://master:10000/bigdata29");Statement stat = conn.createStatement();ResultSet rs = stat.executeQuery("select * from students limit 10");while (rs.next()) {int id = rs.getInt(1);String name = rs.getString(2);int age = rs.getInt(3);String gender = rs.getString(4);String clazz = rs.getString(5);System.out.println(id + "," + name + "," + age + "," + gender + "," + clazz);}rs.close();stat.close();conn.close();}
}

四、Hive排序

1.全局排序(order by

  • order by 会对输入做全局排序,因此只有一个reducer,会导致当输入规模较大时,需要较长的计算时间

  • 使用 order by子句排序 :ASC(ascend)升序(默认)| DESC(descend)降序

  • order by放在select语句的结尾

  • 语法:select * from 表名 order by 字段名1[,别名2...];

2.局部排序(对reduce内部做排序)

  • sort by 不是全局排序,其在数据进入reducer前完成排序

  • 如果用sort by进行排序,并且设置mapred.reduce.tasks大于1,则sort by 只保证每个reducer的输出有序,不保证全局有序。asc,desc都可以。

步骤:

(1)设置reduce个数

         set mapreduce.job.reduce=自定义数量;

(2)查看reduce个数

         set mapreduce.job.reduces;

(3)排序

         select * from 表名 sort by 字段名[,字段名...];

3.分区排序(指定分区方式局部排序)

  • distribute by(字段)根据指定的字段将数据分到不同的reducer,且分发算法是hash散列。

    类似MR中partition,进行分区,结合sort by使用。(注意:distribute by 要在sort by之前)

  • 指定分区排序,相同字段的数据可以分到同一分区,在此分区下是有序的

步骤:

(1)设置reduce个数

          set mapreduce.job.reduce=自定义数量;

(2)排序

         select * from 表名 distribute by 字段名[,字段名...] sort by 字段;

4.分区并排序(指定分区方式局部排序)

  • cluster by = distribute by + sort by 只能默认升序,不能使用倒序

  • 当distribute by 字段1 sort by 字段2 ,当字段1,字段2是相同字段时,可用cluster by 。分区后再排序,会比distribute by id sort by id要快

语法:

select * from 表名 distribute by 字段名[,字段名...] sort by 字段名[,字段名...];

四种排序图解:

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

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

相关文章

2024最新在线工具箱网站系统源码

2024最新在线工具箱网站系统源码 下载地址: 2024最新在线工具箱网站系统源码-JXASP源码网https://www.jxasp.com/think-php/12489.html

记一次IP访问MySQL失败多次被自动锁定导致无法连接问题,解决方法一条SQL足以。

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 前言 今天下午还在带着耳机摸鱼&#xff…

OpenCV4.10使用形态运算提取水平线和垂直线

目标 在本教程中&#xff0c;您将学习如何&#xff1a; 应用两个非常常见的形态运算符&#xff08;即膨胀和侵蚀&#xff09;&#xff0c;并创建自定义内核&#xff0c;以便在水平轴和垂直轴上提取直线。为此&#xff0c;您将使用以下 OpenCV 函数&#xff1a; erode()dilate…

认识异常(2)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

使用cmake进行打包,包含可执行程序和动态依赖库

平常代码开发中&#xff0c;有时候需要将写的程序打包成压缩包放到目标设备上进行运行测试。用CMake管理工程&#xff0c;实现使用make -jnproc package指令可以将工程进行打包&#xff0c;可执行文件存储在bin文件夹中&#xff0c;依赖库存储在lib文件夹中。 示例 1.工程目录结…

CSS基础之伪类选择器(如果想知道CSS的伪类选择器知识点,那么只看这一篇就足够了!)

前言&#xff1a;学习CSS就必须要学习选择器&#xff0c;在之前我们已经学习了基本选择器和复合选择器&#xff0c;但是还有几个选择器没有学习&#xff0c;这篇文章主要讲解伪类选择器。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-…

【动态规划 区间dp 位运算】100259. 划分数组得到最小的值之和

本文涉及知识点 动态规划 区间dp 位运算 LeetCode100259. 划分数组得到最小的值之和 给你两个数组 nums 和 andValues&#xff0c;长度分别为 n 和 m。 数组的 值 等于该数组的 最后一个 元素。 你需要将 nums 划分为 m 个 不相交的连续 子数组&#xff0c;对于第 ith 个子数…

【Linux】基础IO----理解缓冲区

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;理解缓冲区 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;Linux初阶 > 望…

网络安全(防火墙,IDS,IPS概述)

问题一:什么是防火墙,IDS,IPS? 防火墙是对IP:port的访问进行限制,对访问端口进行制定的策略去允许开放的访问,将不放开的端口进行拒绝访问,从而达到充当防DDOS的设备。主要是拒绝网络流量,阻断所有不希望出现的流程,禁止数据流量流通,达到安全防护的作用。如将一些恶…

基于SSM强国有我党建网站

摘要 国家的繁荣富强与每一个人都息息相关密不可分并且关系密切&#xff0c;无论是从事最底层的工作的城市清洁工、工地上的民工、街边自己售卖自制商品进行生活的小商小贩&#xff1b;还是有一定的经济地位可以在电视中&#xff0c;采访中&#xff0c;各类访谈节目以及广大影…

C/C++ BM23 二叉树的前序遍历

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 解决方案二2.1 思路阐述2.2 源码 总结 前言 自己在草稿纸上模拟这个遍历的过程比较简单&#xff0c;但是转移到代码上就突然会懵逼。这个在我之前学数据结构&#xff0c;做到这个实验的时候觉得很难理解。最近虽然已经入职了…

java学习之路-继承

文章目录 前言 目录 1.1继承的概念 1.2继承有什么好处&#xff0c;为何要继承 1.3继承的语句 1.4父类成员的访问 1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法 1.5 super关键字 2.子类构造方法 2.1如何创建构造方法 2.2创建构造方法 3.super和this 【相同点…

C/C++基础----常量和基本数据类型

HelloWorld #include <iostream>using namespace std;int main() {// 打印cout << "Hello,World!" << endl;return 0; }c/c文件和关系 c和c是包含关系&#xff0c;c相当于是c的plus版本c的编译器也可以编译c语言c文件.cpp结尾.h为头文件.c为c语言…

unity android 打包

现在使用的unity版本hub不支持导入support&#xff0c;只能自己下载对应的支持 找到对应的sdk&#xff0c;ndk

自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南

文章目录 一、构建方法1、api/request.js2、api/requestHandler.js3、api/index.js 二、测试方法1、api/axios.js2、main.js3、app.vue4、vue.config.js5、index.html 三、打包1、配置package.json2、生成库包3、配置发布信息4、发布 四、使用1、安装2、使用 五、维护1、维护和…

探索GlusterFS:开源分布式文件系统

目录 引言 一、GlusterFS简介 &#xff08;一&#xff09;基本介绍 &#xff08;二&#xff09;GlusterFS特点 &#xff08;三&#xff09;GlusterFS术语 &#xff08;四&#xff09;GlusterFS工作流程 二、GlusterFs的卷类型 &#xff08;一&#xff09;卷类型 &…

通过一篇文章让你了解Linux的重要性

Linux 前言一、什么是Linux后台vs前台为何大多数公司选择使用Linux作为后台服务器 二、Linux的背景介绍UNIX发展的历史Linux发展历史开源官网发行版本DebianUbuntu红帽企业级LinuxCentOSFedoraKali Linux 三、国内企业后台和用户使用Linux现状IT服务器Linux系统应用领域嵌入式L…

linux下动态库的运用

这里写目录标题 将头文件放入系统路径将.so动态库放入系统路径复制库文件&#xff1a;更新库缓存&#xff1a;验证安装&#xff1a; 完成 将头文件放入系统路径 先将include内容放入/usr/local/include下&#xff0c;这里可以先在/usr/local/include创建一个mkdir hpdf 文件夹…

一种驱动器的功能安全架构介绍

下图提供了驱动器实现安全功能的架构 具有如下特点&#xff1a; 1.通用基于总线或者非总线的架构。可以实现ethercat的FSOE&#xff0c;profinet的profisafe&#xff0c;或者伺服本体安全DIO现实安全功能。 2.基于1oo2D架构&#xff0c;安全等级可以达到sil3。 3.高可用性。单…

Pixel-GS:用于3D高斯溅射的具有像素感知梯度的密度控制

Pixel-GS: Density Control with Pixel-aware Gradient for 3D Gaussian Splatting Pixel-GS&#xff1a;用于3D高斯溅射的具有像素感知梯度的密度控制 Zheng Zhang  Wenbo Hu†  Yixing Lao   老宜兴市郑张文博胡 † Tong He  Hengshuang Zhao† 赵同和恒双 †1122113311 …