Hive--实现随机抽数

1.背景

在大规模数据量的数据分析及建模任务中,往往针对全量数据进行挖掘分析时会十分耗时和占用集群资源,因此一般情况下只需要抽取一小部分数据进行分析及建模操作。

Hive提供了数据取样(SAMPLING)的功能,能够根据一定的规则进行数据抽样,目前支持数据块抽样,分桶抽样和随机抽样,具体如下所示:


2.随机方法

1.数据块抽样(tablesample()函数)

a.tablesample(n percent) 根据hive表数据的大小按比例抽取数据,并保存到新的hive表中。如:抽取原hive表中10%的数据

b.tablesample(n M) 指定抽样数据的大小,单位为M。

c.tablesample(n rows) 指定抽样数据的行数,其中n代表每个map任务均取n行数据,map数量可通过hive表的简单查询语句确认(关键词:number of mappers: x)

select

*

from bi_gamecenter_dev.dim_date

tablesample(10 percent)

-- 注意:测试过程中发现,select语句不能带where条件且不支持子查询,可通过新建中间表或使用随机抽样解决

2.分桶抽样

hive中分桶其实就是根据某一个字段Hash取模,放入指定数据的桶中,比如将表table_1按照ID分成100个桶,其算法是hash(id) % 100,这样,hash(id) % 100 = 0的数据被放到第一个桶中,hash(id) % 100 = 1的记录被放到第二个桶中。创建分桶表的关键语句为:CLUSTER BY语句。

分桶抽样语法:
TABLESAMPLE (BUCKET x OUT OF y [ON colname])
其中x是要抽样的桶编号,桶编号从1开始,colname表示抽样的列,y表示桶的数量。
例如:将表随机分成10组,抽取其中的第一个桶的数据

select

*

from bi_quickgame.dim_qg_fb_cls

tablesample(bucket 1 out of 10 on rand())


3.随机抽样(rand()函数)

1.使用rand()函数进行随机抽样,limit关键字限制抽样返回的数据,其中rand函数前的distribute和sort关键字可以保证数据在mapper和reducer阶段是随机分布的

--  每月随机抽取5天

-- 直接关联这个结果就可以了

select

cal_dt

,month_id

from

(

    select

    cal_dt

    ,month_id

    ,row_number() over(partition by month_id order by rand_order ascas row_rank

    from

    (

        select

        *

        , rand()  as rand_order

        from

        bi_gamecenter_dev.dim_date

        where

        cal_dt >= '2020-01-01'

        and cal_dt <= '2020-07-19'

    )a

)b

where

row_rank <= 5

2.使用order 关键词

select * from table_name where col=xxx order by rand() limit num;

因为order by 只能在一个reduce里面执行,为全局排序,所以可能会导致数据倾斜。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值