分区、分桶的作用:

我们知道在传统的DBMs系统中,一般都具有表分区的功能,通过表分区能够在特定的区域检索数据,减少扫描成本,在一定程度上提高了查询效率,当然我们还可以通过进一步在分区上建立索引,进一步提高查询效率。

在Hive中的数据仓库中,也有分区分桶的概念,在逻辑上,分区表与未分区表没有区别,在物理上分区表会将数据按照分区间的列值存储在表目录的子目录中,目录名=“分区键=键值”。其中需要注意的是分区键的列值存储在表目录的子目录中,目录名=“分区键=键值”。其中需要注意的是分区键的值不一定要基于表的某一列(字段),它可以指定任意值,只要查询的时候指定相应的分区键来查询即可。我们可以对分区进行添加、删除、重命名、清空等操作。

分桶则是指定分桶表的某一列,让该列数据按照哈希取模的方式随机、均匀的分发到各个桶文件中。因为分桶操作需要根据某一列具体数据来进行哈希取模操作,故指定的分桶列必须基于表中的某一列(字段)。分桶改变了数据的存储方式,它会把哈希取模相同或者在某一个区间的数据行放在同一个桶文件中。如此一来便可以提高查询效率。如果我们需要对两张在同一个列上进行了分桶操作的表进行JOIN操作的时候,只需要对保存相同列值的通进行JOIN操作即可。

还有一点需要点一下:在hive中的数据是存储在hdfs中的,我们知道hdfs中的数据是不允许修改只能追加的,那么在hive中执行数据修改的命令时,就只能先找到对应的文件,读取后执行修改操作,然后重新写一份文件。如果文件比较大,就需要大量的IO读写。在hive中采用了分桶的策略,只需要找到文件存放对应的桶,然后读取再修改写入即可。

分区:

hive中分区分为 : 单值分区、范围分区。

单值分区: 静态分区 动态分区

如下所示,现在有一张persionrank表,记录每个人的评级,有id、name、score字段。我们可以创建分区rank(rank不是表中的列,我们可以把它当做虚拟列),并将相应的数据导入指定分区(将数据插入指定目录)。

单值分区:

单值静态分区:导入数据时需要手动指定分区

单值动态分区:导入数据时,系统可以动态判断目标分区

1.静态分区创建:

直接在PARTITI1ONED BY后面跟上分区键、类型即可(指定的分区键不能出现在定义列名中)

CREATE [EXTERNAL] TABLE <table_name>(<col_name> <data_type> [, <col_name> <data_type> ...])-- 指定分区键和数据类型PARTITIONED BY  (<partition_key> <data_type>, ...) [CLUSTERED BY ...] [ROW FORMAT <row_format>] [STORED AS TEXTFILE|ORC|CSVFILE][LOCATION '<file_path>']    [TBLPROPERTIES ('<property_name>'='<property_value>', ...)];

2.静态分区写入:

-- 覆盖写入
INSERT OVERWRITE TABLE <table_name> PARTITION (<partition_key>=<partition_value>[, <partition_key>=<partition_value>, ...]) SELECT <select_statement>;-- 追加写入
INSERT INTO TABLE <table_name> PARTITION (<partition_key>=<partition_value>[, <partition_key>=<partition_value>, ...])SELECT <select_statement>;

3.添加分区:

//只能添加分区列的值,不能添加分区列,如果是多个分区列,不能单独添加其中一个
alter table tablename add partition(col=value)

4.删除分区:

//可以删除一个分区列,但是会把表中所有包含当前分区列的数据全部删除
alter table tablename drop partition(col=value)

5.修复分区:

//手动向hdfs中创建分区目录,添加数据,创建好hive的外表之后,无法加载数据,
//元数据中没有相应的记录
msck repair table tablename

6.动态分区创建:

创建方式与静态分区表完全一样,一张表可同时被静态分区和动态分区键分区,只是动态分区键需要放在静态分区键的后面(HDFS上的动态分区目录下不能包含静态分区的子目录),如下spk即static partition key(静态分区键),dpk为dynamic partition key(动态分区键)

CREATE TABLE <table_name>PARTITIONED BY ([<spk> <data_type>, ... ,] <dpk> <data_type>, [<dpk>
<data_type>,...]);

7.动态分区写入:

根据表中的某一个列值来确定hdfs存储的目录:

优点:

动态可变,不需要人为控制。假如设定的是日期,那么每一天的数据会单独存储在一个文件夹中

缺点:

需要依靠MR完成,执行比较慢

静态分区键要用 <spk>=<value> 指定分区值;动态分区只需要给出分出分区键名称 <dpk>。

-- 开启动态分区支持,并设置最大分区数
set hive.exec.dynamic.partition=true;
//set hive.exec.dynamic.partition.mode=nostrict;
set hive.exec.max.dynamic.partitions=2000;insert into table1 select 普通字段 分区字段 from table2

范围分区:

单值分区每个分区对应于分区键的一个取值,而每个范围分区则对应分区键的一个区间,只要落在指定区间内的记录都被存储在对应的分区下。分区范围需要手动指定,分区的范围为前闭后开区间 [最小值, 最大值)。最后出现的分区可以使用 MAXVALUE 作为上限,MAXVALUE 代表该分区键的数据类型所允许的最大值。

CREATE [EXTERNAL] TABLE <table_name>(<col_name> <data_type>, <col_name> <data_type>, ...)PARTITIONED BY RANGE (<partition_key> <data_type>, ...) (PARTITION [<partition_name>] VALUES LESS THAN (<cutoff>), [PARTITION [<partition_name>] VALUES LESS THAN (<cutoff>),...]PARTITION [<partition_name>] VALUES LESS THAN (<cutoff>|MAXVALUE) )[ROW FORMAT <row_format>] [STORED AS TEXTFILE|ORC|CSVFILE][LOCATION '<file_path>']    [TBLPROPERTIES ('<property_name>'='<property_value>', ...)];

多个范围分区键的情况:

DROP TABLE IF EXISTS test_demo;
CREATE TABLE test_demo (value INT)
PARTITIONED BY RANGE (id1 INT, id2 INT, id3 INT)
(
-- id1在(--∞,5]之间,id2在(-∞,105]之间,id3在(-∞,205]之间
PARTITION p5_105_205 VALUES LESS THAN (5, 105, 205),
-- id1在(--∞,5]之间,id2在(-∞,105]之间,id3在(205,215]之间
PARTITION p5_105_215 VALUES LESS THAN (5, 105, 215),
PARTITION p5_115_max VALUES LESS THAN (5, 115, MAXVALUE),
PARTITION p10_115_205 VALUES LESS THAN (10, 115, 205),
PARTITION p10_115_215 VALUES LESS THAN (10, 115, 215),
PARTITION pall_max values less than (MAXVALUE, MAXVALUE, MAXVALUE)
);

分桶:

对Hive(Inceptor)表分桶可以将表中记录按分桶键的哈希值分散进多个文件中,这些小文件称为桶。

1.创建分桶表:

分桶表的建表有三种方式:直接建表,CREATE TABLE LIKE 和 CREATE TABLE AS SELECT ,单值分区表不能用 CREATE TABLE AS SELECT 建表。这里以直接建表为例:

CREATE [EXTERNAL] TABLE <table_name>(<col_name> <data_type> [, <col_name> <data_type> ...])][PARTITIONED BY ...] CLUSTERED BY (<col_name>) [SORTED BY (<col_name> [ASC|DESC] [, <col_name> [ASC|DESC]...])] INTO <num_buckets> BUCKETS  [ROW FORMAT <row_format>] [STORED AS TEXTFILE|ORC|CSVFILE][LOCATION '<file_path>']    [TBLPROPERTIES ('<property_name>'='<property_value>', ...)];

分桶键只能有一个即<col_name>。表可以同时分区和分桶,当表分区时,每个分区下都会有<num_buckets> 个桶。我们也可以选择使用 SORTED BY … 在桶内排序,排序键和分桶键无需相同。ASC 为升序选项,DESC 为降序选项,默认排序方式是升序<num_buckets> 指定分桶个数,也就是表目录下小文件的个数。

2.向分桶表中写数据:

因为分桶表在创建的时候只会定义Scheme,且写入数据的时候不会自动进行分桶、排序,需要人工先进行分桶、排序后再写入数据。确保目标表中的数据和它定义的分布一致。

目前有两种方式往分桶表中插入数据:

方法一:打开enforce bucketing开关。

SET hive.enforce.bucketing=true;
INSERT (INTO|OVERWRITE) TABLE <bucketed_table> SELECT <select_statement>
[SORT BY <sort_key> [ASC|DESC], [<sort_key> [ASC|DESC], ...]];

方法二:将reducer个数设置为目标表的桶数,并在 SELECT 语句中用 DISTRIBUTE BY <bucket_key>对查询结果按目标表的分桶键分进reducer中。

SET mapred.reduce.tasks = <num_buckets>;
INSERT (INTO|OVERWRITE) TABLE <bucketed_table>
SELECT <select_statement>
DISTRIBUTE BY <bucket_key>, [<bucket_key>, ...]
[SORT BY <sort_key> [ASC|DESC], [<sort_key> [ASC|DESC], ...]]; 

如果分桶表创建时定义了排序键,那么数据不仅要分桶,还要排序

如果分桶键和排序键不同,且按降序排列,使用Distribute by … Sort by分桶排序

如果分桶键和排序键相同,且按升序排列(默认),使用 Cluster by 分桶排序,即如下:

SET mapred.reduce.tasks = <num_buckets>;
INSERT (INTO|OVERWRITE) TABLE <bucketed_table>
SELECT <select_statement>
CLUSTER BY <bucket_sort_key>, [<bucket_sort_key>, ...];

抽样语句 :tablesample(bucket x out of y)

tablesample是抽样语句,语法:tablesample(bucket x out of y),y必须是table总共bucket数的倍数或者因子。Hive根据y的大小,决定抽样的比例。例如:table总共分了64份,当y=32时,抽取2(64/32)个bucket的数据,当y=128时,抽取1/2(64/128)个bucket的数据。x表示从哪个bucket开始抽取。例如:table总共bucket数为32,tablesample(bucket 3 out of 16)表示总共抽取2(32/16)个bucket的数据,分别为第三个bucket和第19(3+16)个bucket的数据。

pypark hive 开启动态分区_Hive分区与分桶相关推荐

  1. hive 修改分桶数 分桶表_Hive中的分桶

    对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分.Hive也是针对某一列进行桶的组织.Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记 ...

  2. hive静态分区,动态分区,分桶区别

    文章目录 绪论 创建静态分区表 1.准备数据 2.建表语句 3.添加分区,加载数据 4.进入网页(50070)查看 创建动态分区表 1.准备数据 2.建表语句 1.首先创建普通表 2.加载数据 3.创 ...

  3. hive查看一张表的分区字段_Hive表的分区与分桶

    1.Hive分区表 Hive使用select语句进行查询的时候一般会扫描整个表内容,会消耗很多时间做没必要的工作.Hive可以在创建表的时候指定分区空间,这样在做查询的时候就可以很好的提高查询的效率. ...

  4. Hive(基础)数据类型、DDL、DML操作、分区和分桶

    Hive数据类型.DDL.DML操作.分区和分桶 1.Hive数据类型 1.1.基本数据类型 1.2.集合数据类型 1.3.数据类型转换 1.3.1.隐式数据类型转换 1.3.1.使用 CAST 操作 ...

  5. hive 修改分桶数 分桶表_hive 学习之路(五)、Hive的分区表与分桶表

    Hive将表划分为分区(partition)表和分桶(bucket)表. 分区可以让数据的部分查询变得更快,也就是说,在加载数据的时候可以指定加载某一部分数据,并不是全量的数据. 分桶表通常是在原始数 ...

  6. hive 建表,分桶表(clustered by)、分桶且桶内排序(clustered by+sorted by)、分区表(partitioned by)、分区分桶一起用

    一.分桶表 1.建表语句 create table test_bucket_sorted ( id int comment 'ID', name string comment '名字' ) comme ...

  7. 一文说透hive中的分桶及抽样查询

    目录 0 引 言 1 分桶与分区的区别 2 分桶及抽样查询 3 小 结 0 引 言 本文围绕hive中分桶问题进行展开研究,分析了hive分桶与分区的区别,分桶的相关原理.分桶的优势,并对分桶的操作方 ...

  8. 大数据学习笔记42:Hive - 分桶表

    文章目录 一.Hive分桶表 1.分桶操作 2.分桶原理 3.注意事项 二.分桶表案例演示 1.创建数据文件courses.txt 2.将数据文件上传到HDFS的/bucket目录 3.基于/buck ...

  9. hive分区用2个字段有何限制_关于Hive使用动态分区插入数据详解

    1.创建一个单一字段分区表 hive>  create table dpartition(id int ,name string ) partitioned by(ct string  ); 2 ...

最新文章

  1. 使用 jQuery 简化 Ajax 开发.
  2. windows bat 批处理 !vm 合并快播文件
  3. 芯唐语音识别_大联大品佳推出基于新唐科技ISD9160+Cyberon算法的语音识别方案
  4. 20非常有用的Java程序片段(11-15)
  5. mac如何把node和npm卸载干净
  6. 5G组网方案和频谱规划
  7. 分享:绘图不可不知的CAD经典技巧
  8. 07-新闻发布系统数据库-新闻信息数据操作
  9. 爬虫基本操作+获取豆瓣250top电影信息
  10. 教程|Word/WPS永久更改默认背景颜色
  11. ES6学习:Map结构的目的和基本用法
  12. webform list页面执行删除操作,使用ajax请求
  13. SCRDet:Towards More Robust Detection for Small, Cluttered and Rotated Objects(摇杆旋转目标检测方法)
  14. 工程师为女朋友自制的硬核礼物
  15. 弹出表情气泡仿魔兽的技能冷效果却实现
  16. 买零食 HihoCoder - 1272 (大爆搜DFS)
  17. monkey脚本执行中如何强行停止
  18. 平台的核心交互与基础角色——互联网平台建设系列
  19. mysql表的增删改select 和 where
  20. 力扣(LeetCode)433. 最小基因变化(2023.03.07)

热门文章

  1. Range回源和视频拖拽播放
  2. H.264(MPEG-4 AVC)级别(Level)、DPB 与 MaxDpbMbs 详解
  3. golang语言操作文件
  4. go 求两个时间相差的天数
  5. go 判断channel是否关闭
  6. leetcode 135. Candy | 135. 分发糖果(原创图文详解,Java)
  7. kotlin学习之lambda(十)
  8. 10.completion_suggester
  9. POJ 3254 状态压缩DP
  10. 1034 Head of a Gang (30 分) One way that the police finds the head of a gang is to check people‘s pho