1.前言

Hive的分区和分桶都是细化数据管理,加快数据查询和分析,两者有什么区别呢?下面讲解一下分区和分桶的原理。

2.分区

(1)分区原理

Hive的分区表可以有一个或多个分区键,用于确定数据的存储方式。分区(除了作为存储单元)还允许用户有效地识别满足指定条件的数据,显著加快查询分析速度。分区字段并不是数据的一部分,而是加载时虚拟的列,数据在HDFS上存储时分区就相当于文件目录。

Hive的分区使用HDFS的子目录功能实现。每一个子目录包含了分区对应的列名和每一列的值

Hive的分区方式:由于Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并不是一个实际字段。

(2)分区建表

分区表使用partitioned by 子句指定,以指定字段列,需要指定字段类型。

--分区表建表sql
USE testdb;
CREATE TABLE test_partition (
field1 String Comment 'field1 comment',
field2 String Comment 'field2 comment'
)
Comment 'table comment'
PARTITIONED BY(d String Comment 'date')
STORED AS ORC; --分区表查询
SELECT *
FROM testdb.test_partition
WHERE d = '2022-02-01';

建表完成后查看LOCATION参数为:'
hdfs://ns/user/hive/warehouse/testdb.db/test_partition'。当存储数据时,2022-02-01日期的数存储在hdfs://ns/user/hive/warehouse/testdb.db/test_partition/d=2022-02-01目录下。

如果指定多个分区列用逗号分隔开,如:建表是PARTITIONED BY(d String Comment 'date',h String Comment 'hour'),分区字段日期常用格式:d=yyyy-MM-dd,h=HH。第二个参数会作为子目录存储在HDFS上:***/test_partition/d=2022-02-01/h=12

3.分桶

(1)分桶原理

分桶表是在表或者分区表的基础上,进一步对表进行组织,分桶表的数据可以根据表中某列的哈希函数的值依次划分为存储桶,用于分桶的字段是数据中实际的一列。其原理:根据分桶的列计算hash值,对hash值取模运算,将数据放到对应的桶里。保证了每个桶中都有数据,但每个桶中的数据条数不一定相等。

如要按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。

(2)分桶建表

分桶表由clustered by 子句指定,指定字段为真实字段,需要指定桶的个数,桶编号从零开始。

--分桶表建表sql,创建4个桶
USE testdb;
CREATE TABLE test_bucket (
field1 String Comment 'field1 comment',
field2 String Comment 'field2 comment'
)
COMMENT 'table comment'
clustered by (field1) into 4 buckets
row format delimited
fields terminated by ','; --分桶表查询
SELECT *
FROM testdb.test_bucket
WHERE field1 = '0'

4.相同点和不同点

(1)相同点

分区和分桶表都是Hive细化数据管理,加快数据查询和分析。

(2)不同点

表现形式:

分区表是一个目录,分桶表是文件。

分桶随机分割数据库,分区是非随机分割数据库。因为分桶是按照列的哈希函数进行分割的,相对比较平均;而分区是按照列的值来进行分割的,容易造成数据倾斜。

创建语句:

分区表使用partitioned by 子句指定,以指定字段为伪列,需要指定字段类型。

分桶表由clustered by 子句指定,指定字段为真实字段,需要指定桶的个数。

数量:

分区表的分区个数可以增长,分桶表一旦指定,不能再增长。

作用:

分区避免全表扫描,根据分区列查询指定目录提高查询速度。

分桶保存分桶查询结果的分桶结构(数据已经按照分桶字段进行了hash散列)。

分桶表数据进行抽样和JOIN时可以提高MR程序效率。

Hive分区和分桶的区别的更多相关文章

  1. hive -- 分区,分桶(创建,修改,删除)

    hive -- 分区,分桶(创建,修改,删除) 分区: 静态创建分区: 1. 数据: john doe 10000.0 mary smith 8000.0 todd jones 7000.0 boss ...

  2. HIVE—索引、分区和分桶的区别

    一.索引 简介 Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键. Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapRed ...

  3. Hive分区表与分桶

    分区表 在Hive Select查询中.通常会扫描整个表内容,会消耗非常多时间做不是必需的工作. 分区表指的是在创建表时,指定partition的分区空间. 分区语法 create table tab ...

  4. Hive动态分区和分桶(八)

    Hive动态分区和分桶 1.Hive动态分区 1.hive的动态分区介绍 ​ hive的静态分区需要用户在插入数据的时候必须手动指定hive的分区字段值,但是这样的话会导致用户的操作复杂度提高,而且在 ...

  5. Hive为什么要分桶

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

  6. hive 分区表和分桶表

    1.创建分区表 hive> create table weather_list(year int,data int) partitioned by (createtime string,area ...

  7. Hive学习笔记——Hive中的分桶

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

  8. Hive 学习之路(五)—— Hive 分区表和分桶表

    一.分区表 1.1 概念 Hive中的表对应为HDFS上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为HDFS上表目录的子目录,数据按照分区存储在子目录中.如 ...

  9. Hive 系列(五)—— Hive 分区表和分桶表

    一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...

  10. 入门大数据---Hive分区表和分桶表

    一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...

随机推荐

  1. 终于!我们把 CEO 炒了,让 ChatGPT 出任 CEO

    ️ FBI Warning:本文纯属作者自娱自乐,数字人的观点不代表 CEO 本人的观点,请大家不要上当受骗!! 哪个公司的 CEO 不想拥有一个自己的数字克隆? 想象一下,如果 CEO 数字克隆上线 ...

  2. C# Emit动态生成代码

    Emit(动态方法生成)技术是一种在运行时动态生成和执行代码的技术.它的产生背景可以追溯到早期的.NET Framework版本. 在早期的.NET Framework中,开发人员通常使用反射来动态创 ...

  3. Cortex M3 - NVIC(中断向量控制器)

    NVIC-概述 nested vector interrupt control - 内嵌向量中断控制器 传统ARM中断控制在Core的外部,软件接收到中断之后,需要查中断的编号,然后启动相应的中断处理 ...

  4. 21-CMOS门电路的逻辑式

    CMOS门电路的逻辑式 通过CMOS门电路,写出门电路的表达式. 方法 只看下方,因为电路上下是对称的: 先找L(输出)的非,找的输出到地的通路,以原变量进行书写.最后将表达式取非,即可得到L.这种方 ...

  5. 【KEIL 】Options for File

    使用" 项目 "窗口的上下文菜单打开此对话框 :菜单选项项目.该对话框包括带有三态替代项的复选框: -已选中且呈灰色 -属性是从父对象继承的.- 选中和白色 -为对象单独设置的属性 ...

  6. java - 数组降序输出

    package array; import java.util.Arrays; /** * 降序 */ public class Reverse { public static void main(S ...

  7. 聊聊x86计算机启动发生的事?

    大家好,我是呼噜噜,最近在看linux早期内核0.12的源码,突然想到一个困扰自己好久的问题:当我们按下电源键,计算机发生了什么?神秘地址0x7C00究竟是什么?操作系统又是如何被加载到硬件中的?带着 ...

  8. [转帖]HTTP X-Forwarded-For 介绍

    https://www.runoob.com/w3cnote/http-x-forwarded-for.html X-Forwarded-For 是一个 HTTP 扩展头部.HTTP/1.1(RFC ...

  9. [转帖]ethtool 命令介绍

    https://www.jianshu.com/p/f456e73a0437 name ethtool - query or control network driver and hardware s ...

  10. [转帖]iptables 执行清除命令 iptables -F 要非常小心的

    使用 /sbin/iptables -F 要小心,搞不好,你就马上同服务器断开连接了 以下是来自 http://wiki.ubuntu.org.cn/IptablesHowTo 上的说明 可以通过/s ...