Hive零基础从入门到实战 进阶篇(十九) HiveQL:随机抽样

目录

 

前言

1. 什么是随机抽样

2. Hive实现简单随机抽样(不放回)

2.1 语法

2.2 举例


 

前言

当数据量非常大的时候,对全体数据进行处理存在困难时,我们可能需要通过随机抽样其中的一部分数据,来代表总体进行分析。本文介绍如何使用Hive对数据集进行随机抽样。

 

1. 什么是随机抽样

随机抽样就是调查对象总体中每个部分都有同等被抽中的可能,是一种完全依照机会均等的原则进行的抽样调查,被称为是一种“等概率”,保证样本具有代表性。随机抽样有四种基本形式,即简单随机抽样、等距抽样、类型抽样和整群抽样。一般我们使用Hive只进行不放回的简单随机抽样

简单随机抽样是一种纯随机抽样,方法简单、直观,是随机抽样理论中最基本的组织形式,是抽样理论的基石。但这种抽样方法必须有一个完整的抽样框,即总体各单位的清单。总体太大时,制作这样的抽样框工作量巨大,加之有许多情况,使总体名单根本无法得到。故在大规模社会调查中很少采用纯随机抽样。但是我们是对Hive中的数据集进行抽样,先天就有完整的抽样框,所以使用不放回的简单随机抽样是最合适的选择,可以很好的代表总体的数据分布情况。

 

2. Hive实现简单随机抽样(不放回)

在Hive中提供了数据取样的功能,用来从Hive表中根据一定的规则进行数据取样,Hive中可以使用三种方式获得采样数据:

分别是:随机抽样、桶表抽样、块抽样。后两种抽样方式个人感觉基本没有应用场景,且不是随机抽样,取出的样本无法代表总体的特征。还不如直接使用limit来截取数据。所以本文主要介绍第一种随机抽样的实现方法。

 

2.1 语法

SELECT *
FROM 表名
DISTRIBUTE BY RAND() 
SORT BY RAND() 
LIMIT n(样本行数);

或者

SELECT *
FROM 表名
ORDER BY RAND() 
LIMIT n(样本行数);

上述两种写法都是通过rand函数实现对表中数据进行随机排序,然后通过limit语句取出想要的样本量。区别是前者运行效率更高,使用order by要在一个reducer中全局排序,性能较差。
 

2.2 举例

从表temp_test12中随机抽取5行数据。

temp_test12中数据如下:

select * from temp_test12;

结果: 
temp_test12.month	temp_test12.shop	temp_test12.money
2019-01 a 1
2019-04 a 4
2019-02 a 2
2019-03 a 3
2019-06 a 6
2019-05 a 5
2019-01 b 2
2019-02 b 4
2019-03 b 6
2019-04 b 8
2019-05 b 10
2019-06 b 12

直接使用rand()函数每次随机取出的数据都会不同: 

SELECT *
FROM temp_test12
DISTRIBUTE BY RAND() 
SORT BY RAND() 
LIMIT 5;

结果:
temp_test12.month	temp_test12.shop	temp_test12.money
2019-04	a	4
2019-03	b	6
2019-05	a	5
2019-06	a	6
2019-05	b	10

SELECT *
FROM temp_test12
ORDER BY RAND() 
LIMIT 5;

结果:
temp_test12.month	temp_test12.shop	temp_test12.money
2019-06	b	12
2019-03	b	6
2019-02	a	2
2019-04	a	4
2019-02	b	4

如果想每次取出一样的随机数据,在rand函数中加入任意一个参数作为种子即可,大家可以多执行几遍下面的代码进行试验:

SELECT *
FROM temp_test12
DISTRIBUTE BY RAND(1) 
SORT BY RAND(1) 
LIMIT 5;

结果:
temp_test12.month	temp_test12.shop	temp_test12.money
2019-02	b	4
2019-06	b	12
2019-04	b	8
2019-01	b	2
2019-04	a	4

SELECT *
FROM temp_test12
ORDER BY RAND(1) 
LIMIT 5;

结果:
temp_test12.month	temp_test12.shop	temp_test12.money
2019-05	a	5
2019-02	a	2
2019-03	a	3
2019-06	b	12
2019-05	b	10


诺!这样就通过Hive实现了随机抽样,学到了么?

 


能看到这里的同学,就右上角点个赞吧,3Q~

 

 

你可能感兴趣的:(Hive零基础从入门到实战 进阶篇(十九) HiveQL:随机抽样)