2019-03-12-Hive的数据抽样

作者: 此星爷非彼星爷 | 来源:发表于2019-03-12 22:41 被阅读5次

最近在做Hive的数据抽样,基于以下考虑:

  • 效率:数据量大的时候,可以给Hive 的使用者提供抽样数据,供他们开发、测试,提高效率。
  • 安全:有些场景,不便于提供全量数据给开发者,但是又不能影响建模效果,这时,就需要随机抽样数据给开发者。

要求:

  • 随机
  • 抽取数据量可控
  • 分区:分区信息需要保留,数据整体随机,分区内也要随机

1. 抽样方案

1.1 方案一:Block Sampling

Hive 本身提供了抽样函数,使用TABLESAMPLE 抽取指定的 行数/比例/大小,举例:

CREATE TABLE XXX AS SELECT * FROM YYY TABLESAMPLE(1000 ROWS);
CREATE TABLE XXX AS SELECT * FROM YYY TABLESAMPLE (20 PERCENT); // 测试未生效
CREATE TABLE XXX AS SELECT * FROM YYY TABLESAMPLE(1M);          // 测试未生效

缺点:不随机。该方法实际上是按照文件中的顺序返回数据,对分区表,从头开始抽取,可能造成只有前面几个分区的数据。

优点:速度快。

1.2 方案二:分桶表抽样 (Smapling Bucketized Table)

利用分桶表,随机分到多个桶里,然后抽取指定的一个桶。举例:随机分到10个桶,抽取第一个桶。

CREATE TABLE XXX AS SELECT * FROM YYY TABLESAMPLE (BUCKET 1 OUT OF 10 ON rand());

优点:随机,测试发现,速度比方法3的rand()快。

1.3 方案三:随机抽样 rand

原理:利用rand()函数进行抽取,rand() 返回一个0到1之间的double 值。

法1

CREATE TABLE XXX AS
SELECT * FROM YYY
    ORDER BY rand()
    limit 10000

此时,可以提供真正的随机抽样,但是,需要在单个reducer中进行总排序,速度慢

法2

CREATE TABLE XXX AS
SELECT * FROM YYY
    SORT BY rand()
    limit 10000

Hive 提供了sort bysort by 提供了单个reducer 内的排序功能,但不保证整体有序,上面的语句是不保证随机性的。

法3

CREATE TABLE XXX AS
SELECT * FROM YYY
    where rand()<0.002
    distribute by rand()
    sort by rand()
    limit 10000;

where 条件首先进行一次map 端的优化,减少reducer 需要处理的数据量,提高速度。distribute by 将数据随机分布,然后在每个reducer内进行随机排序,最终取10000条数据(如果数据量不足,可以提高where条件的rand过滤值)

缺点:速度慢

优点:随机

法4

CREATE TABLE XXX AS
SELECT * FROM YYY
    where rand()<0.002
    cluster by rand()
    limit 10000;

cluster by 的功能是 distribute bysort by的功能相结合,在上面的例子中,distribute by rand() sort by rand() 进行了两次随机,cluster by rand() 仅一次随机,那么,会影响最终的抽样结果吗?

2. 分区

但是,上面的方法,会丢失掉分区信息

所以,需要结合动态分区:

  • step1: create table
  • step2: 利用动态分区,插入select 出来的结果。
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
INSERT INTO TABLE XXX partition(thedate) SELECT * FROM YYY TABLESAMPLE (BUCKET 1 OUT OF 10 ON rand());
wxqr.jpg

相关文章

  • 2019-03-12-Hive的数据抽样

    最近在做Hive的数据抽样,基于以下考虑: 效率:数据量大的时候,可以给Hive 的使用者提供抽样数据,供他们开发...

  • 统计

    抽样采集数据:概率抽样和非概率抽样概率抽样也称为随机抽样,是指遵守随机原则进行的抽样,总体中每个单位都有一定的机会...

  • 3 流数据挖掘

    1、流数据挖掘课程中介绍了几个主要的功能:1)抽样,2)过滤 3)计数1)抽样:对于大量的数据进行抽样,如果抽取固...

  • 数据抽样

    每天抽取 %5

  • R语言利用sample函数抽样

    sample基本用法参数解释:x表示所要抽样数据,size表示抽样个数,replace为T表示采取有重复的抽样代码...

  • 关于社会科学研究方法的思考

    该文把 “抽样数据等”归类为 第二范式的研究,而把大数据下的研究成为第四范式 大数据与抽样数据相比的优势——摘自《...

  • 信用评分卡模型-抽样

    2.抽样 抽样在我们数据分析的过程当中是经常操作的一种,那么为什么要进行抽样呢? 当我们的数据量很大,分析软件的处...

  • 抽样与估计

    1、抽样数据-数据分析-抽样 2、区间估计EXCEL没有直接的方法得出置信区间,因此需要记住公式。 mean-Ζα...

  • 【Hive】数据抽样

    数据抽样的常用三种方法 1、随机抽样(rand()函数)[#1rand_1] 方法一:order by 与 ran...

  • 大数据开发之Hive优化篇4-Hive的数据抽样-Samplin

    备注:Hive 版本 2.1.1 抽样概述 当数据量特别大时,对全体数据进行处理存在困难时,抽样就显得尤其重要了。...

网友评论

    本文标题:2019-03-12-Hive的数据抽样

    本文链接:https://www.haomeiwen.com/subject/vdaopqtx.html