博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hive总结(四)Hive中的桶
阅读量:4231 次
发布时间:2019-05-26

本文共 2518 字,大约阅读时间需要 8 分钟。

感谢原作者elsearch

hive中有桶的概念,对于每一个表或者分区,可以进一步组织成桶,说白点,就是更细粒度的数据范围。

hive采用列值哈希,然后除以桶的个数以求余的方式决定该条记录存放在哪个桶当中。
使用桶的好处:
1、获得更高的查询处理效率。桶为表加上了额外的结构,Hive在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

2、使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

需要特别注意的是:clustered by和sorted by不会影响数据的导入,这意味着,用户必须自己负责数据如何如何导入,包括数据的分桶和排序。
可以使用’set hive.enforce.bucketing = true’
可以自动控制上一轮reduce的数量从而适配bucket的个数,

看个例子

原始数据
15 xiaohong
16 xiaoming
17 xiaohuang
18 xiaocui
19 xiaoma
21 xiaocai
22 xiaojie
25 xiaoliu
28 xaoqi
先创建一张普通表,再创建一张桶的表。
复制代码

create table student(id INT, age INT, name STRING)partitioned by(p_date STRING) row format delimited fields terminated by '\t';create table  bucketed_student(id INT, age INT, name STRING)partitioned by(stat_date STRING) clustered by(id) sorted by(age) into 2 bucketrow format delimited fields terminated by '\t';

load数据到普通表,因为直接load到分桶的表是不会分桶,需要insert进行才会根据根据分桶要求进行分桶。

LOAD DATA LOCAL INPATH '/home//aaa' OVERWRITE INTO table bucketed_student partition(p_date='2016');set hive.enforce.bucketing = true;insert overwrite table bucketed_student partition(p_date='2016') select id,age,name from student where p_date=2016

查看两表的目录,发现分桶会生成两份数据文件

hadoop fs -ls /data/hive/warehouse/temp.db/bucketed_student/p_date=2016Found 2 items-rwxr-xr-x   3 webopa hive         50 2016-11-23 13:53 /data/hive/warehouse/temp.db/bucketed_student/p_date=2016/000000_0-rwxr-xr-x   3 webopa hive         68 2016-11-23 13:53 /data/hive/warehouse/temp.db/bucketed_student/p_date=2016/000001_0

普通表是一份

hadoop fs -ls /data/hive/warehouse/temp.db/student/p_date=2016Found 1 items-rwxrwxrwx   3 webopa hive        117 2016-11-23 11:41 /data/hive/warehouse/temp.db/student/p_date=2016/aaa

查看下分通表每个文件中的数据。偶数一个文件,基数一个文件。

hadoop fs -cat /data/hive/warehouse/temp.db/bucketed_student/p_date=2016/000000_08   28  xaoqi6   22  xiaojie4   19  xiaoma2   16  xiaominghadoop fs -cat /data/hive/warehouse/temp.db/bucketed_student/p_date=2016/000001_07   25  xiaoliu5   21  xiaocai3   18  xiaocui3   17  xiaohuang1   15  xiaohong

查看sampling数据:

select * from bucketed_student  tablesample(bucket 1 out of 2 on id);8   28  xaoqi   20166   22  xiaojie 20164   19  xiaoma  20162   16  xiaoming    2016

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

y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。
例如,table总bucket数为32,tablesample(bucket 3 out of 16),表示总共抽取(32/16=)2个bucket的数据,分别为第3个bucket和第(3+16=)19个bucket的数据。

转载地址:http://doiqi.baihongyu.com/

你可能感兴趣的文章
Memcached,session共享
查看>>
Tomcat,varnish
查看>>
SVN, 制作RPM包
查看>>
HTML 标签说明
查看>>
CSS 基本语法
查看>>
10.shell基础
查看>>
为人处世小技巧
查看>>
结构体知识汇总
查看>>
内存操作越界略述
查看>>
消息与消息队列
查看>>
关于#include "stdafx.h"
查看>>
VC下线程同步的三种方法(互斥、事件、临界区)/(转)
查看>>
非常好的一篇U-BOOT的文章--转载
查看>>
【设计模式】学习之创建型 单例模式
查看>>
【设计模式】学习之创建型 原型模式
查看>>
【设计模式】学习之结构型 适配器模式-装饰器模式-代理模式
查看>>
Maven+Eclipse+Tomcat+Spring MVC web 请求 404 问题总结及noHandlerFound
查看>>
SpringMVC API缓存 LastModified的实现总结
查看>>
406 Not Acceptable 415 Unsupported Media Type Spring MVC consumes与produces
查看>>
MyBatis 高级映射与懒加载
查看>>