文档章节

Hive分桶表总结

Avner
 Avner
发布于 2017/08/10 16:19
字数 1028
阅读 15
收藏 0
点赞 0
评论 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的数据,并且是第一个桶中的数据。

 

© 著作权归作者所有

共有 人打赏支持
Avner
粉丝 8
博文 42
码字总数 45068
作品 0
杭州
程序员
2、Hive的DDL选择项

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

刘付kin ⋅ 2016/12/01 ⋅ 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 ⋅ 0

Hive 基础(1):分区、桶、Sort Merge Bucket Join

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

xrzs ⋅ 2013/11/24 ⋅ 3

hive创建表语句详解

创建表的语句: Create [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [......

超人学院 ⋅ 2015/05/07 ⋅ 0

分区、分桶和索引

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

qhaiyan ⋅ 2016/12/03 ⋅ 0

【十八掌●武功篇】第十掌:Hive之基本语法

这一篇博文是【大数据技术●降龙十八掌】系列文章的其中一篇,点击查看目录:大数据技术●降龙十八掌 小系列列表 【十八掌●武功篇】第十掌:Hive之基本语法 【十八掌●武功篇】第十掌:Hiv...

chybin500 ⋅ 2017/11/17 ⋅ 0

hive常用优化方式

1.列裁剪分区裁剪 尽可能早地过滤掉尽可能多的数据量,避免大量数据流入外层SQL。 列裁剪:在列存格式下(RCFile),列裁剪可以是我们只获取需要的列的数据,减少数据输入。 分区裁剪:分区在...

JPblog ⋅ 2016/08/02 ⋅ 0

hive官方文档翻译

概念 Hive是什么 Hive是一个基于Apache Hadoop的数据仓库。对于数据存储与处理,Hadoop提供了主要的扩展和容错能力。 Hive设计的初衷是:对于大量的数据,使得数据汇总,查询和分析更加简单。...

qi49125 ⋅ 2017/09/16 ⋅ 0

Hive 数据模型

Hive 数据模型 Hive 数据表有五种类型:内部表,外部表,分区表,桶表,视图表,默认以 tab 分隔 * MySQL (Oracle) 表默认以逗号分隔,因此,要想导入 MySQL(Oracle) 数据,需要设置分隔符,...

菜鸟的征程 ⋅ 01/07 ⋅ 0

HQL语法小记(未完成……)

一、CLI操作: 1. 使用hive: hive // 进入交互界面hive -e 'sql' // 直接传入SQL执行hive -f filePath // 传入写有SQL的filePath quit; // 退出hive dfs -ls /tmp; // 查询当前hdfs文件系统...

rathan0 ⋅ 2015/08/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部