hive 中分桶抽样查询的原理刨析

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

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:

select * from stu_buck2 tablesample(bucket 1 out of 2 on id);

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

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

举例2:

select * from stu_buck2 tablesample(bucket 1 out of 1 on id);

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

抽0,1,2,3号桶

举例3:

select * from stu_buck2 tablesample(bucket 2 out of 8 on id);

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

抽1号桶的一半

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

建表语句:

--创建分桶表
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;

数据:

1    jake
1    mike
2    ace
3    luffey
4    namy
5    franky
2    zoro
3    sanji
4    usoop
3    kapu
2    jinx
1    jake1
1    mike1
2    ace1
3    luffey1
4    namy1
5    franky1
2    zoro1
3    sanji1
4    usoop1
3    kapu1
2    jinx1
6    usoop4
7    kapu4
8    jin3
9    jake5
6    mike2
7    ace4
8    luffey3
9    namy5
6    franky2
7    zoro3
8    sanji5
9    usoop5
6    kapu4
7    jinx2
8    kap
9    jin

data

分好的桶如下

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

其实    

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

原文地址:https://www.cnblogs.com/yangxusun9/p/12430857.html

时间: 2024-08-28 12:17:42

hive 中分桶抽样查询的原理刨析的相关文章

NSPredicate用法总结(Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取)

简述:Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取. 定义(最常用到的方法): [objc] view plaincopy NSPredicate *ca = [NSPredicate predicateWithFormat:(NSString *), ...]; Format:(1)比较运算符>,<,==,>=,<=,!=可用于数值及字符串例:@"number > 100" (2)范围

Kubernetes(k8s)底层网络原理刨析

目录 1 典型的数据传输流程图 2 3种ip说明 3 Docker0网桥和flannel网络方案 4 Service和DNS 4.1 service 4.2 DNS 5 外部访问集群 5.1 外部访问service 5.2 ingress 附 扩展实战 附A 用service实现DB的管理 附B 用NetworkPolicy实现访问权限隔离 附C 用secret对象管理账户密码 1 典型的数据传输流程图 ? 一个外部的business-manager请求,首先进入集群的入口(ingress),i

大数据--hive分桶查询&amp;&amp;压缩方式

一.分桶及抽样查询 1.分桶表创建 --------------------------------------- hive (db_test)> create table stu_buck(id int,name string) > clustered by(id) > into 4 buckets > row format delimited fields terminated by '\t';OKTime taken: 0.369 seconds --------------

Hive SQL之分区表与分桶表

Hive sql是Hive 用户使用Hive的主要工具.Hive SQL是类似于ANSI SQL标准的SQL语言,但是两者有不完全相同.Hive SQL和Mysql的SQL方言最为接近,但是两者之间也存在着显著的差异,比如Hive不支持行级数据的插入.更新和删除,也不支持事务操作. 注: HIVE 2.*版本之后开始支持事务功能,以及对单条数据的插入更新等操作 Hive的相关概念 Hive数据库 Hive中的数据库从本质上来说仅仅就是一个目录或者命名空间,但是对于具有很多用户和组的集群来说,这个

Hive中的分桶

对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分.Hive也是针对某一列进行桶的组织.Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中. 把表(或者分区)组织成桶(Bucket)有两个理由: (1)获得更高的查询处理效率.桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构.具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现.比

Hive里的分区和分桶再谈

 分桶是细粒度的,分桶是不同的文件. 分区是粗粒度的,即相当于,表下建立文件夹.分区是不同的文件夹. 桶在对指定列进行哈希计算时,会根据哈希值切分数据,使每个桶对应一个文件. 里面的id是哈希值,分过来的. 分桶,一般用作数据倾斜和数据抽样方面.由此,可看出是细粒度. Hive 中创建分区表没有什么复杂的分区类型(范围分区.列表分区.hash 分区,混合分区等).分区列也不是表中的一个实际的字段,而是一个或者多个伪列.意思是说,在表的数据文件中实际并不保存分区列的信息与数据. 注意:普通表(外部

HIVE—索引、分区和分桶的区别

一.索引 简介 Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键. Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapReduce任务中需要读取的数据块的数量. 为什么要创建索引? Hive的索引目的是提高Hive表指定列的查询速度.没有索引时,类似'WHERE tab1.col1 = 10' 的查询,Hive会加载整张表或分区,然后处理所有的rows,但是如果在字段col1上面存在索引时,那么只会加载和处理文件的一部分

Hive表的分区与分桶

1.Hive分区表 Hive使用select语句进行查询的时候一般会扫描整个表内容,会消耗很多时间做没必要的工作.Hive可以在创建表的时候指定分区空间,这样在做查询的时候就可以很好的提高查询的效率. 创建分区表的语法: [java] view plain copy create table tablename( name string )partitioned by(key,type...); 示例 [java] view plain copy drop table if exists emp

Hive分区表与分桶

分区表 在Hive Select查询中,一般会扫描整个表内容,会消耗很多时间做没必要的工作. 分区表指的是在创建表时,指定partition的分区空间. 分区语法 create table tablename name string ) partitioned by(key type,-) create table if not exists employees( name string, salary string, subordinates array<string>, deduction