分区与分桶

news2024/9/24 22:22:06

分区

分区字段大小写:

在hive中,分区字段名是不区分大小写的,不过字段值是区分大小写的。我们可以来测试一下

导入数据

 
 

load data local inpath '/home/hivedata/user1.txt' into table part4 partition(year='2018',month='03',DAy='21'); load data local inpath '/home/hivedata/user3.txt' into table part4 partition(year='2018',month='03',day='AA');

查看分区的数量

 
 

show partitions tableName

添加和删除分区

添加分区:

添加分区的时候,partition之间 没有符号!

 
 

-- 单个分区 alter table part3 add partition(year='2023',month='05',day='02'); -- 多个分区 alter table part3 add partition(year='2023',month='05',day='03') partition(year='2023',month='05',day='04'); 一下子添加多个分区,partition 之间没有符号! -- 添加分区,并且带有数据 alter table part3 add partition(year='2023',month='05',day='05') location '/user/hive/warehouse/yhdb.db/part1/dt=2023-08-25'; -- 多分区,带数据 alter table part3 add partition(year='2020',month='05',day='06') location '/user/hive/warehouse/yhdb.db/part1/dt=2023-08-25' partition(year='2020',month='05',day='07') location '/user/hive/warehouse/yhdb.db/part1/dt=2023-08-25';

删除分区:

删除分区的时候,partition之间,有逗号!

 
 

--删除一个分区: alter table part3 drop partition(year='2023',month='05',day='05'); --删除多个分区,中间有逗号 alter table part3 drop partition(year='2023',month='05',day='02'),partition(year='2023',month='05',day='03');

查看表结构

 

desc formatted part3;

对比一下:

desc part4;

desc formatted part4;

desc extended part4;

让分区关联数据的三种方式【重点】

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

create table if not exists part5( id int, name string, age int ) partitioned by (year string,month string,day string) row format delimited fields terminated by ',';

 

在hdfs上创建文件夹: hive (yhdb)> dfs -mkdir -p /user/hive/warehouse/yhdb.db/part5/year=2023/month=08/day=28; 上传数据 hive (yhdb)> dfs -put /home/hivedata/user1.txt /user/hive/warehouse/yhdb.db/part5/year=2023/month=08/day=28;

这时查询数据,发现此时表中是没有数据的,原因是partition的元数据没有在mysql中,修复一下:

msck repair table part5;

通过修复的日志,可以看出,修复操作其实是在part5这个表的元数据中,添加了分区的数据。

再次测试 select * from part5 ,发现就有数据了

(2)上传数据后添加分区

 

在hdfs上创建文件夹: hive (yhdb)> dfs -mkdir -p /user/hive/warehouse/yhdb.db/part5/year=2023/month=08/day=27; 上传数据 hive (yhdb)> dfs -put /home/hivedata/user1.txt /user/hive/warehouse/yhdb.db/part5/year=2023/month=08/day=27; 创建一个分区: alter table part5 add partition(year='2023',month='08',day='27');

先创建一个分区,会不会产生文件夹呢?会! 创建一个分区表,会不会产生文件夹呢?不会! 你也可以先创建分区,在分区的文件夹里面,上传数据!

alter table part5 add partition(year='2023',month='08',day='26'); 添加分区之后就有了文件夹:/user/hive/warehouse/yhdb.db/part5/year=2023/month=08/day=26 在这个文件夹里面上传数据: dfs -put /home/hivedata/user1.txt /user/hive/warehouse/yhdb.db/part5/year=2023/month=08/day=26;

(3) 方式三:load数据到分区

 

-- load一下数据:(我们经常使用load上传数据) load data local inpath '/home/hivedata/user1.txt' into table part5 partition(year='2023',month='08',day='25'); 这种方式其实没必要,因为不创建文件夹,load数据到分区表也会自动创建的。

分区的种类:

静态分区:先创建分区,再加载数据

动态分区:直接加载数据,根据数据动态创建分区

混合分区:分区字段有静态的,也有动态的。

动态分区:

根据数据的查询结果,动态的生成不同的分区

不能使用load加载,需要先建普通的表,查询出来再加入到表中

动态分区的玩法:

(1)开启动态分区功能(默认true,开启) set hive.exec.dynamic.partition=true; (2)设置为非严格模式(动态分区的模式,默认strict ,表示 必须指定 至少 一个分区为静态分区,nostrict模式表示 允许所有的分区字段都可以使用动态分区) set hive.exec.dynamic.partition.mode=nostrict; (3) 在所有执行MR的节点上,最大一共可以创建多少个动态分区,默认为1000 set hive.exec.dynamic.partitions=1000; (4)在每个执行MR的节点上,最大可以创建多少个动态分区。 该参数需要根据实际的数据来设定。比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。 set hive.exrc.dynatmic.partitions.pernode=100;

创建普通的表,将数据加载进去: -- 创建表 create table order_partition ( order_no string, type string, order_time string ) row format delimited fields terminated by '\t'; -- 加载数据 load data local inpath "/home/hivedata/dongtai.txt" into table order_partition; 接着按照需求,创建动态分区表 create table order_dynamic_partition ( order_no string ) partitioned by(type String, `time` String) row format delimited fields terminated by '\t'; 导入数据:效果就是按照type和time 两个字段的数据,动态的创建分区: 一定不要使用load加载数据,要从普通表中查询数据插入到动态表: insert overwrite table order_dynamic_partition partition (type, `time`) select order_no, type, order_time from order_partition; hive (yhdb)> show partitions order_dynamic_partition; OK partition type=china/time=2014-05-01 type=china/time=2014-05-02 type=usa/time=2014-05-01 Time taken: 0.254 seconds, Fetched: 3 row(s) 思考:order_no, type, order_time 能过换成* insert overwrite table order_dynamic_partition partition (type, `time`) select * from order_partition; 虽然没有报错,但是不建议: 因为动态分区是由规律的:动态分区数据必须是查询数据的后几位。 insert overwrite table order_dynamic_partition partition (type, `time`) select order_no, type, order_time from order_partition; 动态分区需要依赖于两个字段的数据,这两个数据必须是最后两个,而且必须数据要照应. 也就是说,不管select 有多少个字段,最后两个字段必须照应,否则有问题!

分桶

1、分桶的意义

数据分区可能导致有些分区,数据过多,有些分区,数据极少。分桶是将数据集分解为若干部分(数据文件)的另一种技术。

分区和分桶其实都是对数据更细粒度的管理。当单个分区或者表中的数据越来越大,分区不能细粒度的划分数据时,我们就采用分桶技术将数据更细粒度的划分和管理。

分桶必须分区

分区和分桶都属于hive优化的一部分

分桶没有分区作用大

提高效率

底层原理其实是MR的分区 HashPartitioner

与MapReduce中的HashPartitioner的原理一模一样

2、分桶的原理

与MapReduce中的HashPartitioner的原理一模一样 MapReduce:使用key的hash值对reduce的数量进行取模(取余) hive:使用分桶字段的hash值对分桶的数量进行取模(取余)。针对某一列进行分桶存储。每一条记录都是通过分桶字段的值的hash对分桶个数取余,然后确定放入哪个桶。 MapReduce: Key 单词 reduce的数量是3个,最后形成3个。 hello --> hello 进行hash算法 --> 得到的hash值对3取模(0 1 2) MapReduce假如不指定分区,是否有分区呢?答案是有,使用默认分区HashPartitioner。 Hive --> 假如 我指定分桶字段为 id , 桶的数量为 3个,就是hash(id) % 3 = 0 1 2 桶是一个个的文件,分区是一个个的文件夹。

3、分桶有啥好处

分区的意义:提高查询效率 分桶的意义:将每一个分区的数据进行切分,变成一个个小文件,然后进行抽样查询(从一堆数据中找一些数据进行分析)。在进行多表联查的时候,可以提高效率(hive优化的时候再提)。

分桶是在分区的基础上再分,分的是文件而不是文件夹

分桶可以做抽样查询 (利用百分比查询)

在分桶表中导入数据(标准)

创建一个普通分区表,然后将数据导入分区表中(采用insert 而不是 load)

再导入到分桶表内

cluster by(分桶且排序,分桶字段和排序字段必须一样)

1) 建表

-- 创建分桶的表: create table stu_bucket(id int, name string) clustered by(id) into 4 buckets row format delimited fields terminated by ' ';

2) 设置reduce的数量:

想要将表创建为4个桶,需要将hive中mapreduce.job.reduces参数设置为>=4或设置为-1; 通过 set mapreduce.job.reduces ; 可以查看参数的值 hive (yhdb)> set mapreduce.job.reduces; mapreduce.job.reduces=-1 hive (yhdb)> set mapreduce.job.reduces=-1; reduces = -1 表示让系统自行决定reduce的数量。

3) 加载数据

建议:不要使用load直接加载! 使用:创建普通表,加载普通表的数据到分桶表。 建议不要使用load直接加载,但是可以尝试一下: load data local inpath '/home/hivedata/student.txt' into table tmp_bucket;

接下来使用标准写法:

-- 创建一个普通的分区表 create table temp_stu ( id int, name string ) row format delimited fields terminated by ' '; load data local inpath '/home/hivedata/student.txt' into table temp_stu; -- 将数据导入分桶表中 insert into tmp_bucket select * from temp_stu cluster by (id);

分桶的查询

查询的数据不是很对.... 不知道是什么原因,但是语法是正确的 语法: tablesample(bucket x out of y on sno) 注意:这里的x不能大于y on后面跟分桶字段。 select * from stu_bucket; select * from stu_bucket tablesample(bucket 1 out of 1); 查询第一桶 select * from stu_bucket tablesample(bucket 1 out of 4 on id); 查询第一桶和第三桶 select * from stu_bucket tablesample(bucket 1 out of 2 on id); 查询第二桶和第四桶的数据 select * from stu_bucket tablesample(bucket 2 out of 2 on id); 查询对8取余的第一桶的数据: -- 即使只定义了4桶的分桶,也依旧可以查8桶 (将数据分为8份,取第一份) select * from stu_bucket tablesample(bucket 1 out of 8 on id); -- 抽样查询 select * from cq01 tablesample(bucket 1 out of 4 on id); select * from cq01 tablesample(bucket 1 out of 4 on id) where name = 'xx'; select * from cq01 tablesample(3 rows); -- 行数 select * from cq01 tablesample(30 percent); -- 数量的百分比 select * from cq01 tablesample(6B); -- B K M G T P 具体数量 单位(K,KB,MB,GB...) select * from cq01 tablesample(bucket 1 out of 4 on rand()); -- rand()随机抽样 select * from cq01 order by rand() limit 3;-- 随机抽3行数据

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

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

相关文章

Mysql——初识Mysql

目录 数据库基础 创建数据库 服务器,数据库,表关系 数据逻辑存储 MySQL架构 SQL分类 存储引擎 mysql服务端是一个网络服务器,采用的是TCP协议在应用层 ,mysql有自己的协议。 数据库基础 mysql不是数据库,是mysql的…

18.1 k8s服务组件之4大黄金指标讲解

本节重点介绍 : 监控4大黄金指标 Latency:延时Utilization:使用率Saturation:饱和度Errors:错误数或错误率 apiserver指标 400、500错误qps访问延迟队列深度 etcd指标kube-scheduler和kube-controller-manager 监控4大黄金指标 …

从手动测试菜鸟,到自动化测试老司机,实现自动化落地

虽然许多伙伴是一个测试老人了,但是基本上所有的测试经验都停留在手工测试方面,对于自动化测试方面的实战经验少之又少。 其实,究其原因:一方面是,自动化方面不求上进,觉得会手工测试就可以了,自…

【计算机基础】用bat命令将Unity导出PC包转成单个exe可执行文件

Unity打包成exe可执行文件 上边连接是很久以前用过的方法,发现操作有些不一样了,并且如果按上述操作比较麻烦,所以写了个bat命令。 图1、导出的pc程序 如图1是导出的pc程序,点击exe文件可运行该程序。 添加pack_project.bat文件 …

基于 SpringBoot 的在线考试系统

专业团队,咨询就送开题报告,欢迎大家私信留言,联系方式在文章底部 摘 要 网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合,利用java技术建设在线考试系统,实现在线考试的信息化管理。则对…

PX4固定翼控制器详解(五)——L1、NPFG控制器

之前已经讲解了TECS高度与速度控制器,今天是PX4固定翼控制器系列讲解的最后一期,主题是PX4的位置控制器。PX4 1.12及其之前的版本,使用的位置控制器为L1控制器。1.13及其之后的版本,PX4更新了NPFG控制器。NPFG控制器在较强风速下有…

活动目录安全

活动目录安全 1.概述2.常见攻击方式SYSVOL与GPP漏洞MS14-068漏洞Kerberoast攻击内网横移抓取管理员凭证内网钓鱼与欺骗用户密码猜解获取AD数据库文件 3.权限维持手段krbtgt账号与黄金票据服务账号与白银票据利用DSRM账号利用SID History属性利用组策略利用AdminSDHolder利用SSP…

宠物空气净化器去浮毛哪家强?希喂、美的和米家实测分享

要说养宠物后里最让我感到幸福感飙升的家电,必须是宠物空气净化器,没有之一。很多人都喜欢宠物,但应该没有人喜欢清扫,特别是家里宠物多,或者一群宠物在自己家聚在一起之后,要疯狂清除浮毛,真的…

剖解相交链表

相交链表 思路:我们计算A和B链表的长度,求出他们的差值(len),让链表长的先多走len步,最后在A,B链表一起向后走,即可相逢于相交节点 实现代码如下: public class Solution {public …

单链表进阶

之前已经介绍过单链表及其一些简单的功能 这次来简单介绍单链表一些的其他接口 1.在指定位置之前插入数据 具体原码,三个参数,phead是链表的指针,pos是节点的地址,x是需要插入的数据。 pos不能为空指针,因为pos为空…

React启动时 Error: error:0308010C:digital envelope routines::unsupported

错误信息: 错误原因:通常与 Node.js 的新版本中 OpenSSL 的默认行为变化有关。从 Node.js 17 开始,OpenSSL 默认启用了 OpenSSL 3.0 的一些新特性,这可能会影响到一些旧的或未更新的库。 解决办法:可以通过设置环境变…

基于STM32设计的室内育苗环境管理系统(物联网)

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成 1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发 1.5 模块的技术详情介绍【1】ESP8266-WIFI模块【2】MQ135传感器【4】DHT11传感器【5】B1750传感器 …

【Diffusion分割】FDiff-Fusion:基于模糊学习的去噪扩散融合网络

FDiff-Fusion: Denoising diffusion fusion network based on fuzzy learning for 3D medical image segmentation 摘要: 近年来,去噪扩散模型在图像分割建模中取得了令人瞩目的成就。凭借其强大的非线性建模能力和优越的泛化性能,去噪扩散模…

Flexus X实例全方位指南:智能迁移、跨云搬迁加速与虚机热变配能力的最佳实践

目录 前言 一、云迁移关键挑战 1、企业实例选型关键挑战 2、云算力关键挑战之一 3、云算力关键挑战之二 二、本地IT及其他云搬迁到Flexus X实例上的独有优势 1、Flexus X实例超强性能,遥遥领先同规格友商实例 (1)底层多重调优&#x…

网络编程——TCP网络通信

通信步骤: 1、连接 2、传输数据 3、关闭连接服务端的创建流程: 1、创建服务端socket对象 socket_family:网络地址类型AF_INET--代表的是ipv4地址类型 socket_type:套接字类型SOCK_STREAM--代表的是tcp套接字SOCK_DGRAM--代表的是udp套接字 2、绑定自己的…

新房安装了约克VRF中央空调真的是明智的选择!

夏天越来越热,新房安装了中央空调真的是太明智了!当初装修时,考虑到家里空间大,我就决定装一个中央空调。对比了好多品牌后,朋友推荐了约克VRF中央空调。装好以后,简直惊喜不断!      强效除…

基于SpringBoot+Vue+MySQL的美食点餐管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在数字化快速发展的今天,餐饮行业也迎来了转型升级的重要机遇。传统餐饮管理方式面临效率低下、顾客体验不佳等问题。为此,开发一款基于SpringBootVueMySQL架构的美食点餐管理系统显得尤为重要。该系统旨…

【Qualcomm】高通SNPE框架简介、下载与使用

目录 一 高通SNPE框架 1 SNPE简介 2 QNN与SNPE 3 Capabilities 4 工作流程 二 SNPE的安装与使用 1 下载 2 Setup 3 SNPE的使用概述 一 高通SNPE框架 1 SNPE简介 SNPE(Snapdragon Neural Processing Engine),是高通公司推出的面向移…

Leetcode尊享面试100题-252.会议室

给定一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] ,请你判断一个人是否能够参加这里面的全部会议。 示例 1: 输入:intervals [[0,30],[5,10],[15,20]] 输出&#xff…

记录Mac编译Android源码踩过的坑

学习Android源码,如果电脑配置还不错,最好还是下载一套源码,经过编译后导入到Android Studio中来学习,这样会更加的直观,代码之间的跳转查看会更加方便。因此,笔者决定下载并编译一套源码,以利于…