Hive将表划分为分区(partition)表和分桶(bucket)表。

分区可以让数据的部分查询变得更快,也就是说,在加载数据的时候可以指定加载某一部分数据,并不是全量的数据。

分桶表通常是在原始数据中加入一些额外的结构,这些结构可以用于高效的查询,例如,基于ID的分桶可以使得用户的查询非常的块。

Hive分区表

什么是分区表?

Hive分区是指按照数据表的某一个字段或多个字段进行统一归类,并存储在在hdfs上的不同文件夹中。当查询过程中指定了分区条件时,只将该分区对应的目录作为Input,从而减少MapReduce的输入数据,提高查询效率。

分区表物理存储结构

分区表表在hdfs上作为一个文件夹存在。

1

2

3

4

5

6

7

8

90: jdbc:hive2://node03:10000> dfs -ls /user/hive/warehouse/myhive1.db/score;

+----------------------------------------------------+--+

| DFS Output |

+----------------------------------------------------+--+

| Found 4 items |

| drwxr-xr-x - hadoop supergroup 0 2020-06-07 15:57 /user/hive/warehouse/myhive1.db/score/month=201803 |

| drwxr-xr-x - hadoop supergroup 0 2020-06-07 15:57 /user/hive/warehouse/myhive1.db/score/month=201804 |

| drwxr-xr-x - hadoop supergroup 0 2020-06-07 15:57 /user/hive/warehouse/myhive1.db/score/month=201805 |

| drwxr-xr-x - hadoop supergroup 0 2020-06-07 15:53 /user/hive/warehouse/myhive1.db/score/month=201806 |

分区表使用场景

实际工作中分区表常常被运用于按照某一维度进行统计分析的场景下,数据被按照某一个日期、年月日等等,将一个大的文件切分成一个个小文件,分而治之,这样处理起来性能就好多了。

分区表语法

创建分区表语法1hive (myhive)> create table score(s_id string, c_id string, s_score int) partitioned by (month string) row format delimited fields terminated by '\t';

创建一个表带多个分区1hive (myhive)> create table score2 (s_id string,c_id string, s_score int) partitioned by (year string, month string, day string) row format delimited fields terminated by '\t';

加载数据到分区表当中去1hive (myhive)>load data local inpath '/kkb/install/hivedatas/score.csv' into table score partition (month='201806');

加载数据到多分区表当中去1hive (myhive)> load data local inpath '/kkb/install/hivedatas/score.csv' into table score2 partition(year='2018', month='06', day='01');

查看分区1

2

3

4

5

6

7

8

9

10show partitions score;

+---------------+--+

| partition |

+---------------+--+

| month=201803 |

| month=201804 |

| month=201805 |

| month=201806 |

+---------------+--+

添加一个或多个分区1

2

3alter table score add partition(month='201805');

alter table score add partition(month='201804') partition(month = '201803');

特殊说明:添加分区之后就可以在hdfs文件系统当中看到表下面多了一个文件夹

删除分区1alter table score drop partition(month = '201806');

特殊说明:同内部表和外部表一致,如果该分区表为外部表,则分区对应的HDFS目录数据不会被删除。

分区表练习一

需求描述:现在有一个文件score.csv文件,里面有三个字段,分别是s_id string, c_id string, s_score int

字段都是使用 \t进行分割

存放在集群的这个目录下/scoredatas/day=20180607,这个文件每天都会生成,存放到对应的日期文件夹下面去

文件别人也需要公用,不能移动

请创建hive对应的表,并将数据加载到表中,进行数据统计分析,且删除表之后,数据不能删除

需求实现:本地上传数据到hdfs

1

2

3cd /opt/module/hive-1.1.0-cdh5.14.2/data/test

hdfs dfs -mkdir -p /scoredatas/day=20180607

hdfs dfs -put score.csv /scoredatas/day=20180607/

创建外部分区表,并指定文件数据存放目录

1create external table score4(s_id string, c_id string, s_score int) partitioned by (day string) row format delimited fields terminated by '\t' location '/scoredatas';

进行表的修复,说白了就是建立我们表与我们数据文件之间的一个关系映射(),修复成功之后即可看到数据已经全部加载到表当中去了

msck repair table score4;

静态与动态分区的实现

上文讲到的数据导入场景即为静态分区的使用场景。

动态分区

指按照需求实现把数据自动导入到表的不同分区中,不需要手动指定。

创建表1

2

3

4

5

6

7

8

9

10

11

12

13--创建普通表

create table t_order(

order_number string,

order_price double,

order_time string

)row format delimited fields terminated by '\t';

--创建目标分区表

create table order_dynamic_partition(

order_number string,

order_price double

)partitioned BY(order_time string)

row format delimited fields terminated by '\t';

准备数据1

2

3

4

5

6

7

8

9

10

11

12cd /opt/module/hive-1.1.0-cdh5.14.2/data/test

vim order_partition.txt

100011002019-03-02

100022002019-03-02

100033002019-03-02

100044002019-03-03

100055002019-03-03

100066002019-03-03

100077002019-03-04

100088002019-03-04

100099002019-03-04

向普通表t_order加载数据1load data local inpath '/opt/module/hive-1.1.0-cdh5.14.2/data/test/order_partition.txt' overwrite into table t_order;

动态加载数据到分区表中1

2

3

4

5

6-- 要想进行动态分区,需要设置参数

-- 开启动态分区功能

hive> set hive.exec.dynamic.partition=true;

-- 设置hive为非严格模式

hive> set hive.exec.dynamic.partition.mode=nonstrict;

hive> insert into table order_dynamic_partition partition(order_time) select order_number, order_price, order_time from t_order;

查看分区1

2

3

4

5

6

7

8

9show partitions order_dynamic_partition;

+------------------------+--+

| partition |

+------------------------+--+

| order_time=2019-03-02 |

| order_time=2019-03-03 |

| order_time=2019-03-04 |

+------------------------+--+

Hive分桶表

什么是分桶表?

Hive分桶是相对分区进行更细粒度的划分。是将整个数据内容按照某列取hash值,对桶的个数取模的方式决定该条记录存放在哪个桶当中;具有相同hash值的数据进入到同一个文件中。

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

创建分桶表

在创建分桶表之前要执以下的命令,开启对分桶表的支持以及reduce个数1

2

3

4set hive.enforce.bucketing=true;

# 设置与桶相同的reduce个数(默认只有一个reduce)

set mapreduce.job.reduces=4;

创建分桶表1

2

3

4create table myhive1.user_buckets_demo(id int, name string)

clustered by(id)

into 4 buckets

row format delimited fields terminated by '\t';

如何向分桶表中导入数据

向分桶表中导入数据,不可以直接加载,需要先导入普通标,再导入分桶表中,这种和动态分区类似。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42# 创建普通表

create table user_demo(id int, name string)

row format delimited fields terminated by '\t';

# 准备数据文件 buckets.txt

cd /opt/module/hive-1.1.0-cdh5.14.2/data/test

vim user_bucket.txt

1anzhulababy1

2anzhulababy2

3anzhulababy3

4anzhulababy4

5anzhulababy5

6anzhulababy6

7anzhulababy7

8anzhulababy8

9anzhulababy9

10anzhulababy10

# 向普通标中导入数据

load data local inpath '/opt/module/hive-1.1.0-cdh5.14.2/data/test/user_bucket.txt' overwrite into table user_demo;

# 查看数据

select * from user_demo;

+---------------+-----------------+--+

| user_demo.id | user_demo.name |

+---------------+-----------------+--+

| 1 | anzhulababy1 |

| 2 | anzhulababy2 |

| 3 | anzhulababy3 |

| 4 | anzhulababy4 |

| 5 | anzhulababy5 |

| 6 | anzhulababy6 |

| 7 | anzhulababy7 |

| 8 | anzhulababy8 |

| 9 | anzhulababy9 |

| 10 | anzhulababy10 |

+---------------+-----------------+--+

# 加载数据到桶表user_buckets_demo中

insert into table user_buckets_demo select * from user_demo;

分桶表物理存储结构

分桶表表在hdfs上作为一个文件存在。

1

2

3

4

5

6

7

8

9

100: jdbc:hive2://node03:10000> dfs -ls /user/hive/warehouse/myhive1.db/user_buckets_demo;

+----------------------------------------------------+--+

| DFS Output |

+----------------------------------------------------+--+

| Found 4 items |

| -rwxr-xr-x 3 hadoop supergroup 30 2020-06-08 13:30 /user/hive/warehouse/myhive1.db/user_buckets_demo/000000_0 |

| -rwxr-xr-x 3 hadoop supergroup 45 2020-06-08 13:30 /user/hive/warehouse/myhive1.db/user_buckets_demo/000001_0 |

| -rwxr-xr-x 3 hadoop supergroup 47 2020-06-08 13:30 /user/hive/warehouse/myhive1.db/user_buckets_demo/000002_0 |

| -rwxr-xr-x 3 hadoop supergroup 30 2020-06-08 13:30 /user/hive/warehouse/myhive1.db/user_buckets_demo/000003_0 |

+----------------------------------------------------+--+

分通表使用场景取样sampling更高效。没有分桶的话需要扫描整个数据集。

提升某些查询操作效率,例如map side join

如何抽样查询桶表的数据

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

x表示从第几个桶开始取数据

y与进行采样的桶数的个数、每个采样桶的采样比例有关

1

2

3

4select * from user_buckets_demo tablesample(bucket 1 out of 2);

-- 需要采样的总桶数=4/2=2个

-- 先从第1个桶中取出数据

-- 1+2=3,再从第3个桶中取出数据

特殊说明:分区表可以与分桶表一起使用

hive 修改分桶数 分桶表_hive 学习之路(五)、Hive的分区表与分桶表相关推荐

  1. Hive学习之路(二):Hive表操作详讲

    操作内容简介 一.操作前的准备 二.Hive表操作详讲 1. 创建数据库 2. 查看所有数据库/表 3. 在Hive上直接操作HDFS 4. 在Hive上直接执行终端命令 5. 创建数据表/查看表的信 ...

  2. java 设置年轻代堆大小,[JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配...

    [JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配 [JVM学习之路]五.堆(一)堆的内存结构.参数设置.分代思想.内存分配策略及TLAB 一.堆的核心概述 堆的特点: 1.一个jvm实 ...

  3. 【大数据学习之路之hive】

    大数据学习之路之hive hive安装 mysql安装 前言 安装步骤 1.解压文件 2.安装依赖库 3.安装结束后,配置mysql 4.设置开机自启动 5.添加环境变量 6.初始化mysql 7.开 ...

  4. hive查看数据库里库的信息_Hive学习之路 (三)Hive元数据信息对应MySQL数据库表...

    概述 Hive 的元数据信息通常存储在关系型数据库中,常用MySQL数据库作为元数据库管理.上一篇hive的安装也是将元数据信息存放在MySQL数据库中. Hive的元数据信息在MySQL数据中有57 ...

  5. ipad分屏功能怎么开启_手机学习办公效率低?试试开启vivo“分屏多任务”功能...

    在当下这个特殊时期,许多企业与学校纷纷选择在家办公/学习,诚然,在科技如此发达的今天,大众仅需一台手机,就可以完成大部分的工作与学习计划.但对于部分人群来说,手机每次只能显示一个应用的设定也拖慢了工作 ...

  6. sqoop建表_Sqoop学习之路 (一)

    一.概述 sqoop 是 apache 旗下一款"Hadoop 和关系数据库服务器之间传送数据"的工具. 核心的功能有两个: 导入.迁入 导出.迁出 导入数据:MySQL,Orac ...

  7. Hive学习之路(四):Hive内置函数介绍与实现WordCount

    内容简介 一.Hive内置函数介绍 二.Hive常用内置函数介绍 1.数值计算函数 2.字符串操作函数 3.日期函数 4.聚合函数 5.表生成函数 三.使用Hive函数完成WordCount 1.创建 ...

  8. MySQL学习之路(八):MySQL创建数据表

    CREATE TABLE语句 在创建数据库之后,接下来就要在数据库中创建数据表.所谓创建数据表,指的是在已经创建的数据库中建立新表. 创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性( ...

  9. C++学习之路 | PTA乙级—— 1071 小赌怡情 (15 分)(精简)

    1071 小赌怡情 (15 分) 常言道"小赌怡情".这是一个很简单的小游戏:首先由计算机给出第一个整数:然后玩家下注赌第二个整数将会比第一个数大还是小:玩家下注 t 个筹码后,计 ...

最新文章

  1. 增加一个dbe连接_pogo pin连接器是如何解决振动的问题?
  2. H5 画布解决跨域问题,画布保存为图片显示在页面上
  3. 桁架机器人运动视频_桁架机器人的直线定位单元
  4. CV之OD:计算机视觉之目标检测(Object Detection)方向的简介、使用方法、案例应用之详细攻略
  5. 今年电子设计竞赛取消了?
  6. java中显示动态信息的方法_java里的动态表单技术
  7. Java加密与解密的艺术~安全协议~单向认证服务
  8. js for in 获得遍历数组索引和对象属性
  9. button按钮绑定回车事件
  10. 我爱刷题系列汇总(51-100)【2017.11.24-2018.01.12】
  11. 全网首发:以字型为例,一维表示的二维数组矩阵,以易理解的方式旋转90、-90
  12. 淘宝客APP源码导购APP源码代理淘客APP源码
  13. Hadoop 快速入门
  14. python 导入数据集并画图_python matplotlib画图教程学习:(三)IRIS数据集作图
  15. 计算软件介绍siesta、vasp、wien2k、PWSCF、Materials Studio
  16. 柯洁预言AI绘画会替代大部分画师,网友:初代AI受害者现身说法
  17. 计算机开始栏没有启动项,win7系统快速启动栏里面的快速启动项没有了并且无法添加,怎么处理?...
  18. 2021程序员必看面试指南-进大厂年薪百万需要付出多少努力?你看看你们配吗......
  19. uniapp小程序一键连接wifi
  20. java win10窗口启动假死_win10电脑任务栏和窗口假死怎么办_win10任务栏和窗口假死的解决方法...

热门文章

  1. 华硕Tinker Board开发板(rk3288处理器)开发 ---- GPIO使用备忘
  2. [Unity3D]Unity3D游戏开发Lua随着游戏的债券(在)
  3. TCL S960T刷机包 乐蛙OS5 稳定版 流畅 优化
  4. 跨境电商,50+爆款案例,揭示独立站选品7大逻辑
  5. 微信小程序实战篇-商品详情页(一)
  6. php留言板发送邮箱功能,留言板新增留言自动发送指定邮箱方法
  7. MPLS小实验 HUB Spoke
  8. 【androidx86 5.1.1】Android HttpClient请求过程解析(上)
  9. 问题记录--25端口邮件发送失败
  10. 抖音直播人气自助下单平台 抖音人气怎么变多