前言
当数据量特别大时,对全体数据进行处理存在困难时,抽样就显得尤其重要了。抽样可以从被抽取的数据中估计和推断出整体的特性,是科学实验、质量检验、社会调查普遍采用的一种经济有效的工作和研究方法。
Hive提供了数据取样(SAMPLING)的功能,能够根据一定的规则进行数据抽样,目前支持数据块抽样,分桶抽样和随机抽样,下面结合具体例子分别学习。
准备工作
(1)新建测试用表:employInfo
create table employInfo(deptID int,employID int,employName string,employSalary double)
row format delimited fields terminated by ',';
(2)导入测试数据:
load data local inpath '/home/hadoop/datas/employInfo.txt' into table employinfo;
测试的数据量较小,只有100条数据:
下面分别介绍三种抽样方式:
一、数据块抽样(Block Sampling)
使用TABLESAMPLE函数抽取指定的 行数/比例/大小。
优点:速度快。
缺点:不随机,该方法实际上是按照文件中的顺序返回数据,对分区表从头开始抽取,可能造成只有前面几个分区的数据。如下:
1、 tablesample(n percent)
根据hive表数据的大小按比例抽取数据,并保存到新的hive表中。如:抽取原hive表中10%的数据。
- 注意:测试过程中发现,select语句不能带where条件且不支持子查询,可通过新建中间表或使用随机抽样解决
- 该语句允许抽取数据大小的至少n%(不是行数,而是数据大小)做为输入,支持CombineHiveInputFormat而一些特殊的压缩格式是不能够被处理的,如果抽样失败,MapReduce作业的输入将是整个表。由于在HDFS块层级进行抽样,所以抽样粒度为块的大小,例如如果块大小为128MB,即使输入的n%仅为10MB,也会得到128MB的数据。
示例: