文档章节

Hive分桶表总结

Avner
 Avner
发布于 2017/08/10 16:19
字数 1028
阅读 59
收藏 0

   本文主要转至:http://www.cnblogs.com/skyl/p/4737847.html

      Hive 中 table 可以拆分成 Partition table 和 桶(BUCKET),对于Table或者Partition, Hive可以进一步组织成桶,也就是说桶Bucket是更为细粒度的数据范围划分。Bucket是对指定列进行hash,然后根据hash值除以桶的个数进行求余,决定该条记录存放在哪个桶中。桶操作是通过 Partition 的 CLUSTERED BY 实现的,BUCKET 中的数据可以通过 SORT BY 排序。

优点①:获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在相同列上划分了桶的表,可以使用 Map-side Join 的高效实现。

优点②:抽样(sampling)可以在全体数据上进行采样,这样效率自然就低,它还是要去访问所有数据。而如果一个表已经对某一列制作了bucket,就可以采样所有桶中指定序号的某个桶,这就减少了访问量。

缺点:使用业务字段来查询的话,没有什么效果。

 需要特别主要的是,CLUSTERED BY 和 SORT BY 不会影响数据的导入,这意味着,用户必须自己负责数据的导入,包括数据分桶和排序。 ‘set hive.enforce.bucketing=true’ 可以自动控制上一轮 Reduce 的数量从而适配 BUCKET 的个数,当然,用户也可以自主设置 mapred.reduce.tasks 去适配 BUCKET 个数,推荐使用:

操作示例如下。

1) 创建临时表 student_tmp,并导入数据。

hive> desc student_tmp;
hive> select * from student_tmp;

2). 创建桶表

使用 Clustered By 子句来指定划分桶所用的列,以及划分桶的个数。桶中的数据可以根据一个或多个列进行排序Sorted by【此处默认是降序】。由于这样对每个桶的连接变成了高效的归并排序(merge-sort),因此可以进一步提升map端连接的效率。 

hive> create table student0
      (id INT, 
       age INT, 
       name STRING
       )
     partitioned by(stat_date STRING)
     row format delimited 
     fields terminated by ','; 
OK
Time taken: 0.292 seconds
hive> create table student1
      ( id INT, 
        age INT, 
        name STRING
       ) 
      partitioned by(stat_date STRING) 
      clustered by(id) sorted by(age) into 2 buckets 
      row format delimited 
      fields terminated by ',';
OK
Time taken: 0.215 seconds

 3). 设置环境变量。让程序自动分配reduce的数量从而适配相应的bucket;

hive> set hive.enforce.bucketing=true;

4). 导入数据

桶表 student1 加载数据 From Select 是经过MR的,而普通表 student0 加载数据 Load 是不需要启动MR的。事实上,桶表数据文件对应MR的 Reduce输出文件:桶n 对应于输出文件 000000_n 

[root@hadoop01 hive]# more bucket.txt
1,20,zxm
2,21,ljz
3,19,cds
4,18,mac
5,22,android
6,23,symbian
7,25,wp
hive> LOAD data local INPATH '/root/hive/bucket.txt' 
    > OVERWRITE INTO TABLE student0                  
    > partition(stat_date="20120802");
hive> from student0                                                   
    > insert overwrite table student1 partition(stat_date="20120802") 
    > select id,age,name where stat_date="20120802"                   
    > sort by age;

5) 查看文件目录。


hive> dfs -ls /user/hive/warehouse/student1/stat_date=20120802;
Found 2 items
-rw-r--r--   1 root supergroup         31 2015-08-17 21:23
 /user/hive/warehouse/student1/stat_date=20120802/000000_0

-rw-r--r--   1 root supergroup         39 2015-08-17 21:23
 /user/hive/warehouse/student1/stat_date=20120802/000001_0

hive> dfs -text /user/hive/warehouse/student1/stat_date=20120802/000000_0;
6,23,symbian
2,21,ljz
4,18,mac

hive> dfs -text /user/hive/warehouse/student1/stat_date=20120802/000001_0;
7,25,wp
5,22,android
1,20,zxm
3,19,cds

6) 查看 sampling 数据。

hive> select * from student1                     
    > TableSample(bucket 1 out of 2 on id); 
OK
6       23      symbian 20120802
2       21      ljz     20120802
4       18      mac     20120802
Time taken: 10.871 seconds, Fetched: 3 row(s)

注:tablesample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y)

y必须是桶数的整数倍或者因子。hive根据y的大小,决定抽样的比例。例如,桶数64:

  • 当y=32时,抽取(64/32=)2个bucket的数据
  • 当y=64时,抽取(64/64=)1个bucket的数据(此例子就是1)
  • 当y=128时,抽取(64/128=)1/2个bucket的数据

x表示从哪个bucket开始抽取。例如,桶数64,tablesample(bucket 3 out of 32),表示:

  • 总共抽取(64/32=)2个bucket的数据,分别为第3个bucket和第(3+32=)35个bucket的数据。
  • 此例子中,总共抽取(2/2=)1个bucket的数据,并且是第一个桶中的数据。

 

© 著作权归作者所有

共有 人打赏支持
下一篇: Hive 分区表总结
Avner
粉丝 8
博文 60
码字总数 54757
作品 0
杭州
程序员
私信 提问
2、Hive的DDL选择项

----------------DDL------------------- create[external] table [if not exists] table_name [(col_name data_type)]//这句是最基本的,如果加上external就代表为外部表。[partitioned by......

刘付kin
2016/12/01
15
0
Hadoop 2.6 + Hive 1.2.1 + spark-1.4.1(3)

新建表 1) 新建表结构 create table usertable( id int, userid bigint, name string, describe string comment 'desc表示用户的描述' ) comment '这是用户信息表' partitioned by(country ......

片刻
2015/12/28
282
0
Hive 基础(1):分区、桶、Sort Merge Bucket Join

Hive 已是目前业界最为通用、廉价的构建大数据时代数据仓库的解决方案了,虽然也有 Impala 等后起之秀,但目前从功能、稳定性等方面来说,Hive 的地位尚不可撼动。 其实这篇博文主要是想聊聊...

xrzs
2013/11/24
9.8K
3
分区、分桶和索引

1.分区 分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在, 但是该字段不存放实际的数据内容,仅仅是分区的表示(伪列)。 (1)静态分区create table if not e...

qhaiyan
2016/12/03
10
0
Hive DDL 内部表外部表 分区 分桶 行格式 存储文件格式 概述

创建数据库 删除数据库 创建表 内部表,外部表 创建时指定external时为外部表,否则为内部表,或者通过desc formatted table_name;输出表的详细信息,其中Table Type:列会输出存储目录信息和...

PeakFang-BOK
10/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Nginx 内置请求参数

nginx内置变量 内置变量存放在 ngx_http_core_module 模块中,变量的命名方式和apache 服务器变量是一致的。总而言之,这些变量代表着客户端请求头的内容,例如$http_user_agent, $http_coo...

大木老师故事的小黄花
33分钟前
1
0
我为什么坚持写作

说写作可能是抬高了自己,目前来说只能是写东西、记录东西、表达观点和情感。 在俞敏洪的公众号上看到过一篇文章,里面讲了一个观点,大概是说写作不求能写出伟大的作品,只是把自己的生活、...

Bob2100
今天
1
0
中国公有云三巨头,同时支持Rancher Kubernetes平台

华为云容器引擎(CCE)、阿里云K8S容器服务(ACK)和腾讯云K8S引擎(TKE),中国公有云三巨头正式全面支持Rancher Kubernetes平台。 Rancher正式宣布扩大对中国领先Kubernetes服务的支持,华...

RancherLabs
今天
1
0
【NLP】【八】基于keras与imdb影评数据集做情感分类

【一】本文内容综述 1. keras使用流程分析(模型搭建、模型保存、模型加载、模型使用、训练过程可视化、模型可视化等) 2. 利用keras做文本数据预处理 【二】环境准备 1. 数据集下载:http:...

muqiusangyang
今天
1
0
nginx 解决session一致性

session 粘滞性 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 upstream backserver {ip_hash;server 192.168.0.14:88;server 192.1...

zhu_kai1
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部