大数据入门基础系列之浅谈Hive的桶表

在前面的博文里,我已经介绍了

前言

Hive 中 table 可以继续拆分成Partition table(分区表) 和 桶(BUCKET)表,桶操作是通过 Partition 的 CLUSTERED BY 实现的,BUCKET 中的数据可以通过 SORT BY 排序。

  BUCKET 主要作用如下

1) 数据 sampling;

2) 提升某些查询操作效率,例如 Map Side Join。

需要特别主要的是,CLUSTERED BY 和 SORT BY 不会影响数据的导入,这意味着,用户必须自己负责数据的导入,包括数据额分桶和排序。

Hive还可以把表(外部表和内部表)或分区表,组织成桶表。将表或分区组织成桶有以下几个目的:

第一个目的是为看取样更高效,因为在处理大规模的数据集时,在开发、测试阶段将所有的数据全部处理一遍可能不太现实,这时取样就必不可少。

第二个目的是为了获得更好的查询处理效率。

桶为了表提供了额外的结构,Hive在处理某些查询时利用这个结构,能给有效地提高查询效率。

桶是通过对指定列进行哈希计算来实现的,通过哈希值将一个列名下的数据切分为一组桶,并使每个桶对应于该列名下的一个存储文件

以下为创建带有桶的表的语句:

CREATE TABLE bucketed_user(id INT,name String)CLUSTERED BY (id) INTO4 BUCKETS;

向桶中插入数据,这里按照用户id分成了4个桶,在插入数据时对应4个reduce操作,输出4个文件。

分区中的数据可以被进一步拆分成桶,bucket,不同于分区对列直接进行拆分,桶往往使用列的哈希值进行数据采样。

在分区数量过于庞大以至于可能导致文件系统崩溃时,建议使用桶。

桶的数量是固定的。

Hive使用基于列的哈希函数对数据打散,并分发到各个不同的桶中从而完成数据的分桶过程。

注意,hive使用对分桶所用的值进行hash,并用hash结果除以桶的个数做取余运算的方式来分桶保证了每个桶中都有数据,但每个桶中的数据条数不一定相等

哈希函数的选择依赖于桶操作所针对的列的数据类型。除了数据采样,桶操作也可以用来实现高效的Map端连接操作。

记住,分桶比分区,更高的查询效率

如何进行Hive桶表的操作?

例子1

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

hive>desc student_tmp;hive>select*fromstudent_tmp;

2、创建 student 表。经过分区操作过后的表已经被拆分成2个桶。

create table student(idint,ageint,namestring)partitioned by (stat_datestring)clustered by (id) sorted by(age) into 2bucketrow format delimited fields terminated by',';

分区中的数据可以被进一步拆分成桶!!!正确理解

  所有,桶,先partitioned by (stat_date string)

      ,再,clustered by (id) sorted by(age) into 2 bucket

3、设置环境变量。(这个别忘了)

4、插入数据

hive>fromstudent_tmpinsert overwrite table student partition(stat_date='2017-08-20')selectid,age,namewherestat_date='2017-08-20'sort by age;

这都是固定的格式,一环扣一环的。

5、查看文件目录

$ hadoop fs -ls /usr/hive/warehouse/student/stat_date=2017-08-20/

6、查看 sampling 数据。

Hive>select*fromstudent tablesample(bucket1outof2on id);

tablesample 是抽样语句,语法如下:

tablesample(bucket x out of y)

y 必须是 table 中 BUCKET 总数的倍数或者因子。

例子2

在下面的例子中,经过分区操作过后的表已经被拆分成100个桶。

CREATE EXTERNAL TABLE videos_b(prodicerstring,titlestring,categorystring)PARTITIONED BY(yearint)CLUSTERED BY(title)INTO 100 BUCKETS;

现在,我们开始填充这张带桶操作的表:

此外,还需要在SELECT语句后面加上CLUSTERBY来实现INSERT查询。

下面是不使用桶设置的例子:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

看完本文有收获?请转发分享给更多人

关注「大数据躺过的坑」,提升大神技能

觉得不错,请点赞和留言

本文来自企鹅号 - 好记性不如烂笔头干货媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

如何在Python中快速进行语料库搜索:近似最近邻算法

选自Medium 作者:Kevin Yang 机器之心编译 参与:路雪 最近,我一直在研究在 GloVe 词嵌入中做加减法。例如,我们可以把「king」的词嵌入...

2635
来自专栏大数据挖掘DT机器学习

Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录

Python 2.7 IDE Pycharm 5.0.3 Firefox浏览器:47.0.1 PIL : Pillow-3.3.0-cp27-cp27m-...

5598
来自专栏AILearning

Apache Spark 2.2.0 中文文档 - Spark RDD(Resilient Distributed Datasets)论文 | ApacheCN

概要 为了能解决程序员能在大规模的集群中以一种容错的方式进行内存计算这个问题, 我们提出了 RDDs 的概念. 当前的很多框架对迭代式算法场景与交互性数据挖掘...

2739
来自专栏数据结构与算法

一个例子教你如何与出题人斗智斗勇

我以前出过一道题,卡了10种贪心,但还是被第11种贪心A了,  一道题不会做?贪嘛,能怎么贪怎么贪,想怎么贪怎么贪! 现在NOIP题目的数据给的不...

2816
来自专栏熊二哥

快速入门系列--TSQL-01基础概念

    作为一名程序员,对于SQL的使用算是基础中的基础,虽然也写了很多年的SQL,但常常还是记不清一些常见的命令,故而通过一篇博文巩固相关的记忆,并把T-SQ...

2108
来自专栏杨建荣的学习笔记

数据库收缩数据文件的尝试(二)(r11笔记第10天)

在之前自己的一个测试环境中,因为本身磁盘空间不足,导致一个测试库数据目录溢出,最后花了点功夫,将一个2G左右的文件经过收缩的操作后,竟然收缩为7M。详情可以参考...

35811
来自专栏CDA数据分析师

手把手教你如何使用Excel高级筛选

Excel自动筛选在工作中被经常使用,但掌握高级筛选的同学却很少,甚至都不知道高级筛选高级到哪儿了。今天兰色还原一个高大尚的高级筛选功能。 一、高级筛选哪里“高...

2075
来自专栏Y大宽

RNA-seq(6): reads计数,合并矩阵并进行注释

小结 计数分为三个水平: gene-level, transcript-level, exon-usage-level 标准化方法: FPKM RPKM ...

5605
来自专栏Java成长之路

Solr理论基础

传统数据库是为了解决结构化存储而产生的,如关系型数据库、键值存储、操作磁盘文件的map-reduce(映射-规约)引擎,图引擎等。 传统型数据库的缺点:

1443
来自专栏宏伦工作室

深度有趣 | 01-02 前言和准备工作

用 Python 做一些有意思的案例和应用,内容和领域不限,可以包括数据分析、自然语言理解、计算机视觉,等等等等

1082

扫码关注云+社区

领取腾讯云代金券