Hive实践2之【分桶】

16 篇文章 2 订阅

为什么要分桶?

  • 单个分区或者表中的数据量越来越大,当分区不能更细粒的划分数据时,所以会采用分桶技术将数据更细粒度的划分和管理。
  • 通俗点来说就是分区是分文件夹,分桶是将文件夹下的文件分成几个文件块去存储。比如表文件中本来是1000000条数据,由于在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便,所以我们可以分多个文件去存储。
  • 分桶更加细粒度的管理数据,更多的是使用来做抽样、join

1、分桶原理

  • 分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。
  • 对于hive中每一个表、分区都可以进一步进行分桶。
  • 由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中。
  • 适用场景: 数据抽样( sampling ) 与解决数据倾斜

2、分桶操作

注意:分区使用的是表外字段,分桶使用的是表内字段

1、开启hive的桶表功能

set hive.enforce.bucketing = true;

意思:得到bucket的个数和reduce个数是一致的,mr运行时会根据bucket的个数自动分配reduce task个数

2、创建桶表

create table tableName(字段名称 字段类型,字段名称 字段类型, ....)
clustered by(c_id) into n buckets 
row format delimited fields terminated by ‘字段分割符’;

c_id:分桶依据字段
n:桶的个数

3、加载数据

  • 注意事项:
    桶表的数据加载,只能通过insert 插入。hdfs dfs -put文件或者通过load data无法加载。
    所以只能先创建普通表也称为临时表,并通过insert overwrite的方式将普通表的数据通过查询的方式加载到桶表当中去
insert into table 表名 select * from 基础表名;insert overwrite table 表名 select * from 基础表名;

3、分桶实践

1、创建源数据基础表(临时表),存放完整数据

  • 测试数据为一个.csv文件,因此我们在建表时就跳过文件的第一行,这样就不会有脏数据即表头

  • 创建表

create table prior(
order_id int
,product_id int
,add_to_cart_order int
,reordered int
)
row format delimited fields terminated by ','
lines terminated by '\n'
--跳过文件行第一1行
tblproperties("skip.header.line.count"="1");
  • 加载数据
load data local inpath '/hive_data/order_priors.csv' into table prior;

2、开启桶表功能,并创建分桶表prior_bucket

  • 开启桶表功能
set hive.enforce.bucketing = true;
  • 创建分桶表prior_bucket
create table prior_bucket(
order_id int,
product_id int)
clustered by(order_id) into 5 buckets
row format delimited fields terminated by ',';

在这里插入图片描述
3、加载数据到分桶表中

insert into table prior_bucket select order_id,product_id from prior;

在这里插入图片描述

4、了解数据存储

分桶之前数据(在一个文件夹里)

1、终端命令查看

hadoop fs -ls /user/hive/warehouse/test.db/prior

在这里插入图片描述

  • 查看数据前20行
hadoop fs -cat /user/hive/warehouse/test.db/prior/order_products__prior.csv | head -20

在这里插入图片描述

2、 web页面

在这里插入图片描述
分桶之后数据(分桶是文件拆分而不是子文件夹分区)

1、终端命令查看

hadoop fs -ls /user/hive/warehouse/test.db/prior_bucket

在这里插入图片描述
2、web页面查看
在这里插入图片描述

4、桶表应用—数据抽样

  • 桶表 抽样查询语句
select * from 桶表名 tablesample(bucket 1 out of 16 on columns);
  • on columns其实可以省略

  • tablesample(bucket x out of y)语法:

    • x:表示从哪个bucket(桶)开始抽取数据,x不能大于y
    • y:必须是分桶表总bucket数的倍数或者因子。y是指每隔几个分桶取一个分桶。
  • hive根据y的大小,决定抽样的比例。例如,table总共分了4桶,当y=2时,抽取桶数/y即(4/2=)2个bucket的数据即总数据量的2/4,当y=8时,抽取(4/8=)1/2个bucket的数据即总数据量的1/2/4=1/8。

抽取数据规则:

抽取第一桶数据
    select * from 桶表名 tablesample(bucket 1 out of 桶数/1 on sno);
抽取第一桶和第三桶数据
    select * from student tablesample(bucket 1 out of 桶数/2 on sno);
抽取第二桶和第四桶的数据
    select * from student tablesample(bucket 2 out of 桶数/2 on sno);        
  • 假设桶数为4,x=1,y=4:
    从1号桶开始抽取,取4/4个bucket的数据量,即抽取第一桶的数据

  • 假设桶数为4,x=2,y=2:
    从2号桶开始抽取,取4(桶数)/2(y)个bucket的数据量,即抽取第2桶和第4桶的数据

  • 对一个已经分桶的表进行抽样调查,当要查询单独一个桶的数据时,就需要把y设置为已经分好的总桶数,用x来取其中的某一桶;当要查询特殊要求的数据时,我们可以通过改变y值来对数据重新分桶(这个分桶是不会保留的),再通过x去取其中的某一桶。

  • 例子

  • 由于数据量太大,仅显示前十条数据

select * from prior_bucket tablesample(bucket 1 out of 20 on product_id) limit 10;

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值