简介

对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结果。Hive可以通过对表进行抽样来满足这个需求。 就是随机查询

抽样查询

是查询语句,只不过写的时候有指定的格式. 就是按照规则查询指定的桶的数据

demo

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

首先 test_bucket_sorted 必须是一个分桶表

tablesample 是关键字,后面跟 bucket x out of y on 分桶表的字段,如果是根据id分桶,那么就写id, 不能写其他非分桶字段

bucket x out of y on 分桶表分桶字段

假设当前表一共分了z个桶
x是 从当前表的第几桶开始抽样
0y是 z/y 代表一共抽多少桶,假日说z是4,y是2,那么就抽2桶

那么怎么抽呢?从第x桶开始抽,每间隔y桶抽一桶,直到抽满z/y桶.

假设下面sql是 4桶
select *
from test_bucket_sorted tablesample (bucket 1 out of 2 on id);

这样写的意思就是从0号桶开始抽,每间隔两桶抽一桶,一个抽2桶: 结果就是0号桶加2号桶 (1和3)

抽第几桶可以这么理解x+y*(n-1)桶

要求y必须是z的因子或倍数! 这是官方要求,意思是 z除以y必须能被整除,不能有小数点.

语法和要求

格式:select * from 分桶表 tablesample(bucket x out of y on 分桶表分桶字段);
tablesample 是关键字
x 和y 都是数字, on后面有分桶字段. 根据id分桶的话,只能写id字段.

假如说总共有4桶
怎么抽: 从第x桶开始抽样,每间隔y桶抽一桶,直到抽满 z/y桶

bucket 1 out of 2 on id:
这就是相当于抽第一桶和第三桶(0号和2号桶)

从第1桶(0号桶)开始抽,抽第x+y*(n-1),一共抽2桶(这个数字是最大桶除以y算出来的) : 0号桶,2号桶

bucket 2 out of 1 on id:
这样是不行的,因为x需要大于0并且小于y . 而2大于1了,所以就不行

bucket 1 out of 1 on id
x等于y了 ,相当于 从第1桶(0号桶)开始抽,抽第x+y*(n-1), 也就是 4桶
也相当于查询全部了

一共抽4桶 : 0号桶,2号桶,1号桶,3号桶

bucket 2 out of 4 on id

从第2桶(1号桶)开始抽 , ,抽第x+y*(n-1) , 一共抽1桶 : 1号桶

bucket 2 out of 8 on id

从第2桶(1号桶)开始抽,一共抽0.5桶 : 1号桶的一半