【分桶概述】

  Hive表分区的实质是分目录(将超大表的数据按指定标准细分到指定目录),且分区的字段不属于Hive表中存在的字段;分桶的实质是分文件(将超大文件的数据按指定标准细分到分桶文件),且分桶的字段必须在Hive表中存在。

 
  分桶的意义在于:
    1. 可以提高多表join的效率(因为通过分桶已经将超大数据集提取出来了。假如原数据被分了4个桶,此时2表join的时候只需要读取符合条件的一个分桶,则理论上效率可提升4倍)
    2. 加速数据抽样的效率(理由同上,只需要按照指定规则抽取指定分桶的数据即可,不需要扫描全表)
 
  需要Hive表分桶的时候,我们可以注意到Reduce的任务数量 = 分桶的数量,也就是最终产生的分桶文件的个数,因为分桶表就是通过MapReduce任务计算而来。由此可见,其实桶的概念就是MapReduce的分区的概念,两者完全相同。
 
  分桶表取样语法的核心:

select * from tableName tablesample(bucket x out of y on colum)。其中:
x:表示从第x个桶中抽取数据
y:表示每y个桶中抽取一次数据(必须是分桶数量的倍数 or 因子)

【用法简介】

1.开启支持分桶

set hive.enforce.bucketing=true;    -- 默认:false --

  设置为 true 之后,mr 运行时会根据 bucket 的个数自动分配 reduce task的个数。

  当然,用户也可以通过 mapred.reduce.tasks 自己设置 reduce 任务个数,但分桶时不推荐使用。注意:一次作业产生的桶(文件数量)和 reduce task 个数一致)

2.往分桶表中加载数据

/* 往分桶表中插入数据的语法类似下面 */
insert into table bucket_table select columns from tbl; -- 全新插入 -- insert overwrite table bucket_table select columns from tbl; -- 覆盖重写 --

3.分桶表数据抽样

/*
抽样语法:TABLESAMPLE(BUCKET x OUT OF y)。其中:
x:表示从第x个桶中抽取数据
y:表示每y个桶中抽取一次数据(必须是分桶数量的倍数 or 因子)
*/
select * from bucket_table tablesample(bucket 1 out of 4 on columns);

【用法举例】

1. 假设本地文件 /root/hivedata/ft 中有以下内容:

zhang   12
lisi 34
wange 23
zhouyu 15
guoji 45
xiafen 48
yanggu 78
liuwu 41
zhuto 66
madan 71
sichua 89

2. 新建Hive常规表并导入本地文件:

hive> CREATE TABLE ft( id INT, name STRING, age INT)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY'\t';
OK
Time taken: 0.216 seconds hive> load data local inpath'/root/hivedata/ft' into table ft;
Loading data to table hehe.ft
Table hehe.ft stats: [numFiles=1, totalSize=127]
OK
Time taken: 1.105 seconds hive> select *from ft;
OK
1 zhang 12
2 lisi 34
3 wange 23
4 zhouyu 15
5 guoji 45
6 xiafen 48
7 yanggu 78
8 liuwu 41
9 zhuto 66
10 madan 71
11 sichua 89
NULL NULL NULL
Time taken: 0.229 seconds, Fetched: 12 row(s)

3. 创建分桶表:

hive> create table fentong(
> id int,
> name string,
> age int,)clustered by(age) into 4 buckets -- 以字段age来划分成4个桶 --
> row format delimited fields terminated by ',';

  每行数据具体落入几号分桶的规则如下:

    1. 用表中指定的字段值(比如age)来除以桶的个数4;
    2. 结果取余数,也就是求模(若余数为0就放到1号桶,余数为1就放到2号桶,余数为2就放到3号桶,余数为3就放到4号桶)

4. 给分桶表导入数据:

hive> insert into table fentong select name,age from ft;

5. 查询分桶表数据以确认正确导入:

hive> select * from  fentong

6. 我们来看看分桶表的数据如何使用:

hive> select id, name, age from fentong tablesample(bucket 1 out of 4 on age);
OK
NULL NULL NULL
6 xiafen 48
1 zhang 12 hive> select id, name, age from fentong tablesample(bucket 2 out of 4 on age);
OK
11 sichua 89
8 liuwu 41
5 guoji 45 hive> select id, name, age from fentong tablesample(bucket 3 out of 4 on age);
OK
9 zhuto 66
7 yanggu 78
2 lisi 34

Hive的分桶表的更多相关文章

  1. 一起学Hive——创建内部表、外部表、分区表和分桶表及导入数据

    Hive本身并不存储数据,而是将数据存储在Hadoop的HDFS中,表名对应HDFS中的目录/文件.根据数据的不同存储方式,将Hive表分为外部表.内部表.分区表和分桶表四种数据模型.每种数据模型各有 ...

  2. hive中的分桶表

    桶表也是一种用于优化查询而设计的表类型.创建通表时,指定桶的个数.分桶的依据字段,hive就可以自动将数据分桶存储.查询时只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率 ------创 ...

  3. hive 分区表和分桶表

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

  4. 第2节 hive基本操作:11、hive当中的分桶表以及修改表删除表数据加载数据导出等

    分桶表 将数据按照指定的字段进行分成多个桶中去,说白了就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去 开启hive的桶表功能 set hive.enforce.bucketing= ...

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

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

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

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

  7. Hive 教程(四)-分区表与分桶表

    在 hive 中分区表是很常用的,分桶表可能没那么常用,本文主讲分区表. 概念 分区表 在 hive 中,表是可以分区的,hive 表的每个区其实是对应 hdfs 上的一个文件夹: 可以通过多层文件夹 ...

  8. Hive SQL之分区表与分桶表

    Hive sql是Hive 用户使用Hive的主要工具.Hive SQL是类似于ANSI SQL标准的SQL语言,但是两者有不完全相同.Hive SQL和Mysql的SQL方言最为接近,但是两者之间也 ...

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

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

随机推荐

  1. Vue slot 插槽用法:自定义列表组件

    Vue 框架的插槽(slot)功能相对于常用的 v-for, v-if 等指令使用频率少得多,但在实现可复用的自定义组件时十分有用.例如,如果经常使用前端组件库的话,就会经常看到类似的用法: < ...

  2. 乘风破浪,遇见Android Jetpack之Compose声明式UI开发工具包,逐渐大一统的原生UI绘制体系

    什么是Android Jetpack https://developer.android.com/jetpack Android Jetpack是一个由多个库组成的套件,可帮助开发者遵循最佳做法.减少 ...

  3. 又一开源项目爆火于GitHub,Android高级插件化强化实战

    一.插件化起源 插件化技术最初源于免安装运行 Apk的想法,这个免安装的 Apk 就可以理解为插件,而支持插件的 app 我们一般叫 宿主. 想必大家都知道,在 Android 系统中,应用是以 Ap ...

  4. Java基础技术-Java其他主题【面试】

    Java基础技术-Java其他主题[面试] Java基础技术IO与队列 Java BIO.NIO.AIO Java 中 BIO.NIO.AIO 的区别是什么? 含义不同: BIO(Blocking I ...

  5. 安鸾CTF Writeup SSRF03

    SSRF03 题目URL: http://whalwl.host:2000/ 其中的弯路我就不多说了,直接上解题思路 方法和SSRF02类似都是找内网机器端口,继续用ssrf02 这道题的方法:htt ...

  6. MySQL 数据库、数据表、数据的基本操作

    1.数据库(database)管理 1.1 create 创建数据库 create database firstDB; 1.2 show 查看所有数据库 mysql> show database ...

  7. C++程序调试方式总结

    bug调试要根据应用场景和条件,选择什么样子的调试方式很大程度上不是你想选择什么样的调试方式,而是还剩下什么样子的调试方式可用.下面就根据不同的场景和条件来总结一下. 目录: 1.gdb调试或者IDE ...

  8. LeetCoded第2题题解--两数相加

    2.两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表 ...

  9. 十四:Servlet3.0的动态

    动态的创建是为了简化配置文件的.对于我们创建的servlet,filter和listener后可以使用.这也是注解的另外一种替代方式. package com.hotusm.dynamic; impo ...

  10. 三:ServletContext对象

    一.ServletContext对象 1.什么是ServletContext对象 ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象 内部封装是该w ...