Hive08_分区表

一 分区表

1 概念:

分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹,该文件夹下是该分区所

有的数据文件。Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据

集。在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查询效率

会提高很多。

2 案例演示

1 创建分区表语法

hive (default)> create table dept_par(
deptno int, dname string, loc string
)
partitioned by (day string)
row format delimited fields terminated by '\t';

注意:分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。

2 加载数据到分区表中

(1) 数据准备
dept_20220401.log

10	ACCOUNTING	1700
20	RESEARCH	1800

dept_20220402.log

30	SALES	1900
40	OPERATIONS	1700

dept_20220403.log

50	TEST	2000
60	DEV	1900

(2) 加载数据

hive (default)> load data local inpath 
'/usr/soft/datas/dept_20220401.log' into table dept_par 
partition(day='20220401');
hive (default)> load data local inpath 
'/usr/soft/datas/dept_20220402.log' into table dept_par 
partition(day='20220402');
hive (default)> load data local inpath 
'/usr/soft/datas/dept_20220403.log' into table dept_par 
partition(day='20220403');

注意:分区表加载数据时,必须指定分区

在这里插入图片描述

在这里插入图片描述

3 查询分区表中数据

单分区查询

hive (default)> select * from dept_partition where day='20220401';
或者
hive (default)> select * from dept_partition where deptno=10 or deptno=20;

上述第二种方式,是对全表进行搜索查询!

而第一种方式,仅仅对某一张分区表进行搜索查询

多分区联合查询

hive (default)> select * from dept_partition where day='20220401'unionselect * from dept_partition where day='20220402'unionselect * from dept_partition where day='20220403';
hive (default)> select * from dept_partition where day='20220401' or day='20220402' or day='20220403';

4 增加分区

创建单个分区

hive (default)> alter table dept_partition add partition(day='20220404');

同时创建多个分区

hive (default)> alter table dept_partition add partition(day='20220405') 
partition(day='20220406');

5 删除分区

删除单个分区

hive (default)> alter table dept_partition drop partition (day='20220406');

同时删除多个分区

hive (default)> alter table dept_partition drop partition (day='20220404'), partition(day='20220405');

6 查看分区表有多少分区

hive> show partitions dept_partition;

7 查看分区表结构

hive> desc formatted dept_partition;

二 级分区

思考: 如何一天的日志数据量也很大,如何再将数据拆分?

1 创建二级分区表

hive (default)> create table dept_partition2(deptno int, dname string, loc string)partitioned by (day string, hour string)row format delimited fields terminated by '\t';

2 正常的加载数据

(1)加载数据到二级分区表中

hive (default)> load data local inpath 
'/usr/soft/hive/datas/dept_20220401.log' into table
dept_partition2 partition(day='20220401', hour='12');

(2)查询分区数据

hive (default)> select * from dept_partition2 where day='20220401' and hour='12';

3)把数据直接上传到分区目录上,让分区表和数据产生关联的三种方式

(1)方式一:上传数据后修复
上传数据

hive (default)> dfs -mkdir -p
/user/hive/warehouse/dept_partition2/day=20220401/hour=14;hive (default)> dfs -put /usr/soft/datas/dept_20220401.log 
/user/hive/warehouse/dept_partition2/day=20220401/hour=14;

查询数据(查询不到刚上传的数据)

hive (default)> select * from dept_partition2 where day='20220401' and hour='13';

执行修复命令

hive> msck repair table dept_partition3;

Partitions not in metastore:

再次查询数据

hive (default)> select * from dept_partition2 where day='20220401' and hour='13';

(2)方式二:上传数据后添加分区
上传数据

hive (default)> dfs -mkdir -p
/user/hive/warehouse/mydb.db/dept_partition2/day=20220401/hour=14;hive (default)> dfs -put /usr/soft/datas/dept_20220401.log  /user/hive/warehouse/mydb.db/dept_partition2/day=20220401/hour=14;hive (default)> load data inpath '/user/hive/warehouse/mydb.db/dept_partition2/day=20220401/hour=14' into table dept_partition2 partition(day='20220401',hour='14');

执行添加分区

hive (default)> alter table dept_partition2 add partition(day='20220401',hour='14');

查询数据

hive (default)> select * from dept_partition2 where day='20220401' and hour='14';

(3)方式三:创建文件夹后 load 数据到分区
创建目录

hive (default)> dfs -mkdir -p
/user/hive/warehouse/mydb.db/dept_partition2/day=20220401/hour=15;

上传数据

hive (default)> load data local inpath 
'/usr/soft/hive/datas/dept_20220401.log' into table
dept_partition2 partition(day='20220401',hour='15');

查询数据

hive (default)> select * from dept_partition2 where day='20220401' and 
hour='15';

三 动态分区

1 创建表结构

create table dept_no_par1( dname string, loc string ) partitioned by (deptno int) row format delimited fields terminated by '\t'; 

2 查询dept表,并将数据添加到 dept_no_par

insert into table dept_no_par partition(deptno) select dname,loc ,deptno from dept;

使用动态分区,查询的最后一个字段,赋值给分区字段

在这里插入图片描述

直接报错:
设置为非严格模式(动态分区的模式,默认 strict,表示必须指定至少一个分区为静态分区,nonstrict 模式表示允许所有的分区字段都可以使用动态分区。)hive (default)> set hive.exec.dynamic.partition.mode=nonstrict;

在这里插入图片描述

3 其他配置

开启动态分区参数设置

(1)开启动态分区功能(默认 true,开启)

hive.exec.dynamic.partition=true

(2)在所有执行 MR 的节点上,最大一共可以创建多少个动态分区。默认 1000

hive.exec.max.dynamic.partitions=1000

(3)在每个执行 MR 的节点上,最大可以创建多少个动态分区。该参数需要根据实际
的数据来设定。比如:源数据中包含了一年的数据,即 day 字段有 365 个值,那么该参数就
需要设置成大于 365,如果使用默认值 100,则会报错。

hive.exec.max.dynamic.partitions.pernode=100

(4)整个 MR Job 中,最大可以创建多少个 HDFS 文件。默认 100000

hive.exec.max.created.files=100000

(5)当有空分区生成时,是否抛出异常。一般不需要设置。默认 false

hive.error.on.empty.partition=false

案例实操

需求:将 dept 表中的数据按照地区(loc 字段),插入到目标表 dept_partition 的相应分区中。

(1)创建目标分区表

hive (default)> create table dept_partition_dy(id int, name string) 
partitioned by (loc int) row format delimited fields terminated by '\t';

(2)设置动态分区

set hive.exec.dynamic.partition.mode = nonstrict;
hive (default)> insert into table dept_partition_dy partition(loc) select 
deptno, dname, loc from dept;

(3)查看目标分区表的分区情况

hive (default)> show partitions dept_partition;

lt)> create table dept_partition_dy(id int, name string)
partitioned by (loc int) row format delimited fields terminated by ‘\t’;

**(2)设置动态分区**```sql
set hive.exec.dynamic.partition.mode = nonstrict;
hive (default)> insert into table dept_partition_dy partition(loc) select 
deptno, dname, loc from dept;

(3)查看目标分区表的分区情况

hive (default)> show partitions dept_partition;

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

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

相关文章

机器人制作开源方案 | 多地形适应野外探索智能车

1. 作品基本介绍 如今,智能机器人在军事、制造业、交通运输、航天航空、医疗、服务等领域已有广泛的应用,智能车是机器人研究领域的一项重要基础内容,在各种移动机构中,最为常见的是轮式移动方式,当今社会正处于科技高…

Linux 断言的使用

断言为我们提供了一种可以静态或动态地检查程序在目标平台上整体状态的能力,与它相关的接口由头文件 assert.h 提供

霹雳吧啦Wz《pytorch图像分类》-p4GoogLeNet网络

《pytorch图像分类》p4GoogLeNet网络详解 一、GoogLeNet网络中的亮点1.inception结构2.使用11的卷积核进行降维及映射处理3.GoogLeNet辅助分类器4.模型参数 二、模块代码1.BasicConv2d2.Inception 三、课程代码1.module.py2.train.py3.predict.py 一、GoogLeNet网络中的亮点 论…

ES(Elasticsearch)的基本使用

一、常见的NoSQL解决方案 1、redis加粗样式 Redis是一个基于内存的 key-value 结构数据库。Redis是一款采用key-value数据存储格式的内存级NoSQL数据库,重点关注数据存储格式,是key-value格式,也就是键值对的存储形式。与MySQL数据库不同&a…

助力成长的开源项目 —— 筑梦之路

闯关式 SQL 自学:sql-mother 免费的闯关式 SQL 自学教程网站,从 0 到 1 带大家掌握常用 SQL 语法,目前一共有 30 多个关卡,希望你在通关的时候,变身为一个 SQL 高手。除了闯关模式之外,这个项目支持自由选…

剑指 Offer(第2版)面试题 68:树中两个结点的最低公共祖先

剑指 Offer(第2版)面试题 68:树中两个结点的最低公共祖先 剑指 Offer(第2版)面试题 68:树中两个结点的最低公共祖先解法1:递归拓展题:二叉搜索树的最近公共祖先解法1:两次…

java面向对象构造器--学习笔记

什麽是构造器? 构造器就是一种特殊的方法,特殊在: 方法名 类名不能写返回值类 只要声明了这么一个特殊的方法,那么这个方法就不叫方法,叫做构造器了 构造器有什么特点? 创建对象时,对象会去…

STM32 学习(二)GPIO

目录 一、GPIO 简介 1.1 GPIO 基本结构 1.2 GPIO 位结构 1.3 GPIO 工作模式 二、GPIO 输出 三、GPIO 输入 1.1 传感器模块 1.2 开关 一、GPIO 简介 GPIO(General Purpose Input Output)即通用输入输出口。 1.1 GPIO 基本结构 如下图&#xff0…

【数据分析】指数移动平均线的直观解释

slavahead 一、介绍 在时间序列分析中,通常需要通过考虑先前的值来了解序列的趋势方向。序列中下一个值的近似可以通过多种方式执行,包括使用简单基线或构建高级机器学习模型。 指数(加权)移动平均线是这两种方法之间的稳健权衡。…

阿里云服务器端口PPTP 1723放行教程

阿里云服务器安装PPTP VPN需要先开通1723端口,阿里云服务器端口是在安全组中操作的,阿里云服务器网aliyunfuwuqi.com来详细说明阿里云服务器安全组开放PPTP VPN专用1723端口教程: 阿里云服务器放行1723端口教程 PPTP是点对点隧道协议&#…

fastadmin传递参数给html和js,通过身份判断动态显示列表头部住店和离店按钮

首先将管理员或者酒店人员的身份传递给html和js做按钮显示权限 roomorder.php index.html {if $admin_id != 1}<a class="btn btn-success btn-change btn-start btn-disabled" data-params=

2023机器人行业总结,2024机器人崛起元年(具身智能)

2023总结&#xff1a; 1.Chatgpt引爆了通用人工智能&#xff0c;最大的受益者或是机器人&#xff0c;2023年最热门的创业赛道便是人形机器人&#xff0c;优必选更是成为人形机器人上市第一股&#xff0c; 可以说2023年是机器人开启智能化的元年&#xff0c;而2024则将成为机器…