前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hive小知识之分桶抽样

Hive小知识之分桶抽样

作者头像
王知无-import_bigdata
发布2020-08-04 16:45:20
1.2K0
发布2020-08-04 16:45:20
举报

先把大家都知道的分桶抽样查询 的语法以及用法po出

代码语言:javascript
复制
select * from 分桶表 tablesample(bucket x out of y on 分桶字段);

假设当前分桶表,一共分了z桶!

x: 代表从当前的第几桶开始抽样

0<x<=y

y: z/y 代表一共抽多少桶!

y必须是z的因子或倍数!

怎么抽:从第x桶开始抽,当y<=z每间隔y桶抽一桶,直到抽满 z/y桶

举例1:

代码语言:javascript
复制
select * from stu_buck2 tablesample(bucket 1 out of 2 on id);

从第1桶开始抽,每间隔2桶抽一桶,一共抽2桶!

桶号:x+y*(n-1) 抽0号桶和2号桶

举例2:

代码语言:javascript
复制
select * from stu_buck2 tablesample(bucket 1 out of 1 on id);

从第1桶开始抽,每间隔1桶抽一桶,一共抽4桶!

抽0,1,2,3号桶

举例3:

代码语言:javascript
复制
select * from stu_buck2 tablesample(bucket 2 out of 8 on id);

从第2桶开始抽,一共抽0.5桶!

抽1号桶的一半

然而,当我自己实验时,发现实际情况跟预期有偏差

建表语句:

代码语言:javascript
复制
--创建分桶表
create table people (id int,name string)
clustered by (id)
sorted by (name desc) into 4 buckets
row format  delimited fields terminated by '\t';
--创建临时表
create table tmp (id int,name string)
row format delimited fields terminated by '\t';
--加载数据
load data local inpath '/home/guigu/data.txt' into table tmp;
--加载数据到分桶表
insert overwrite table people 
select * from tmp;

然而查询时却发现 本来打算取第2个桶里的4/8 数据,但返回的数据跟预期差得很多

其实

select * from 分桶表 tablesample(bucket x out of y on 分桶字段); 这个抽样查询的底层是把所有数据按照 字段的hash值 % y 分成y 个 区(相当于Hadoop里的分区),然后取第 x 区 中的数据。 之所以没有达到预期的效果,是因为用来测试的数据太少!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据技术与架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档