分区与分桶

分区

分区字段大小写:

在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.xdnf.cn/news/150320.html

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

相关文章

828华为云征文|华为云Flexus云服务器X实例Windows系统部署一键短视频生成AI工具moneyprinter

在追求创新与效率并重的今天,我们公司迎难而上,决定自主搭建一款短视频生成AI工具——MoneyPrinter,旨在为市场带来前所未有的创意风暴。面对服务器选择的难题,我们经过深思熟虑与多方比较,最终将信任票投给了华为云Fl…

毕设基于SSM+Vue3实现设备维修管理系统四:后台框架及基础增删改查功能实现

本章介绍后端基础框架及基础的增删改查功能实现,创建基础的dao、service即controller层相关的基类,并实现基础的增删改查相关功能。 源码下载:点击下载 讲解视频: SMMVUE3实现设备维修管理系统毕设:后端框架搭建及表外…

知识产权增资:如何以无形资产驱动企业价值增长?

随着国家政策的不断推动和各行业技术水平的不断提升,知识产权的增资不仅关乎企业的技术实力展示,更是企业资产增值、市场竞争力增强的关键途径。 概念与意义 知识产权增资,是指企业通过将自身拥有的知识产权评估作价后,作为注册…

Xcode报错:The request was denied by service delegate (SBMainWorkspace)

Xcode报错:The request was denied by service delegate (SBMainWorkspace) 造成的原因: (1)新的M2芯片的Mac电脑 (2) 此电脑首次安装启动Xcode的应用程序 (3)此电脑未安装Rosetta 解决方法: (1)打开终端…

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

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

Jmeter压力测试-ServerAgent-2.2.3闪退问题解决

Jmeter压力测试-ServerAgent-2.2.3闪退问题解决 1. 问题现象描述:2. 原因分析3. 问题解决 1. 问题现象描述: 使用Jmeter进行压力测试时,如果需要收集被测试机器的性能参数,需要在被测试机中启动ServerAgent。 最近在做几个项目的…

性能测试之平均负载

平均负载 除了常见命令top外,常使用的命令有top rootdebian:~# uptime 15:20:25 up 20 days, 23:51, 9 users, load average: 0.62, 0.13, 0.04后面三个数字分别代表 1 分钟,5 分钟,15 分钟的平均负载。 如何理解这个平均负载。 如果数…

英伟达 Blackwell平台和ASIC芯片升级助力,预计2025年液冷散热渗透率将超20%

TrendForce集邦咨询: 英伟达 Blackwell平台和ASIC芯片升级助力,预计2025年液冷散热渗透率将超20% 根据TrendForce集邦咨询最新调查,随着NVIDIA Blackwell新平台预计于2024年第四季出货,将推动液冷散热方案的渗透率明显增长,从202…

c++ std::string初始化为nullptr的问题

一.问题描述 在c std::string或者std::wstring 中是否可以使用nullptr初始化,首先可以说的是是可以用nullptr初始化的,但是程序编译没有问题,运行起来就挂了,char*是可以初始化为nullptr的,为啥以char*为基础的std::…

Rolling Update

滚动更新是一次只更新一小部分副本,成功之后在更新更多的副本,最终完成所有的副本的更新,滚动更新的最大好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性 部署三副本的应用,初始镜像为…

s3c2440——I2C

一、I2C集成电路总线 (Inter-Integrated Circuit)SOC与芯片间通信。 属于同步串行半双工通信方式。 1、组网模式: 2、电器特性 (1)空闲时,两总线都为高电平; (2)数据…

BERT训练环节(代码实现)

1.代码实现 #导包 import torch from torch import nn import dltools #加载数据需要用到的声明变量 batch_size, max_len 1, 64 #获取训练数据迭代器、词汇表 train_iter, vocab dltools.load_data_wiki(batch_size, max_len) #其余都是二维数组 #tokens, segments, vali…

geodatatool(地图资源下载工具)3.8更新

geodatatool(地图资源下载工具)3.8(新)修复更新,修复更新包括: 1.选中下载数据时显示选中个数。 其它一些BUG修复。 如您有其它问题及需求,也可以联系我们,我们将持续维护更新该工…

刷题日记_DAY1

前言 这里记录每日随机刷的错题 两个数组的交集(模拟) 题目描述 题目解析 题目要求返回指定的两个字符串之间的距离,容易想到的一种解法就是暴力遍历,来个双循环,但时间复杂度就为N^2,不符合题意 for(…

【最新华为OD机试E卷-支持在线评测】绘图机器(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

ESXI主机加入VCENTER现有集群提示出现常规性错误

背景:由于忘记了这台主机的root密码,所以在迁移完虚拟机后给这台主机重新安装了操作系统,装完操作系统加集群提示如下报错: 查阅了一些资料后发现主机的CPU是一样的,不需要开EVC; 也有一些说需要改这个配置…

【专题】2024年中国白酒行业数字化转型研究报告合集PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p37755 消费人群趋于年轻化,消费需求迈向健康化,消费场景与渠道走向多元化,这些因素共同驱动企业凭借数据能力来适应市场的变化。从消费市场来看,消费群体、需求、场景及渠道皆展现出与…

图文组合商标部分驳回后优化后初审通过!

这几天以前有个企业的商标初审下来了,以前是加了图形个别部分没有通过初审,后面是把图形去掉重新用文字申请下来初审。 图形与文字同时申请,会分别审查有一个元素过不了,整体就会过不了,所以平常就会建议分开申请注册商…

【Linux实践】实验三:LINUX系统的文件操作命令

【Linux实践】实验三:LINUX系统的文件操作命令 实验目的实验内容实验步骤及结果1. 切换和查看目录2. 显示目录下的文件3. 创建和删除目录① mkdir② rm③ rmdir 4. 输出和重定向① 输出② 重定向 > 和 >> 5. 查看文件内容① cat② head 6. 权限7. 复制8. 排…

【微服务即时通讯系统】——etcd一致性键值存储系统,etcd的介绍,etcd的安装,etcd使用和功能测试

文章目录 etcd1. etcd的介绍1.1 etcd的概念 2. etcd的安装2.1 安装etcd2.2 安装etcd客户端C/C开发库 3. etcd使用3.1 etcd接口介绍 4. etcd使用测试4.1 原生接口使用测试4.2 封装etcd使用测试 etcd 1. etcd的介绍 1.1 etcd的概念 Etcd 是一个基于GO实现的 分布式、高可用、一致…