hive抽样总结

顺序抽样:缺点没有随机但是速度快
按行抽取100行
select *from foo tablesample(100rows);

按照百分比抽取 20%数据(不是行数)仅支持CombineHiveInputformat不能处理特殊的压缩格式
select *from foo tablesample(20 percent);

按照大小抽取1M,同上仅支持CombineHiveInputformat不能处理特殊的压缩格式
select * from foo tablesample(1M);

=========
分桶表抽样:
首先需要建立一个分桶表依照id分桶依照id正序将id列按照hash取磨分为16个桶,cluster by id order by id into 16 buckets
select *from foo tablesample(bucket 3 out of 8 on id) //表明在id的列上进行抽样 拿取第三个桶和第11个桶
select *from foo tablesample(bucket 3 out of 16 on Rand())//表明在整行上抽样而不是单个列

随机抽样 rand() 以下的缺点都是缺少了分区信息所以可以配合动态分区来添加分区详情
原理:利用rand函数进行抽取,rand()返回一个从0到1的double值 也可以添加种子例如rand(1000)表明从1到1000里随机抽也是double类型

例一:
此是真正的随机抽样但是一个reduce效率慢
select *from foo order by rand()limit 100;

例二:
分区内有序,整体无序
select *from foo sort by rand()limit 100;

例三:
where在map端先进行过滤减少reduce处理的数据量 然后distribute by 将数据随机分发,然后再每个reduce进行排序,缺点速度慢
select *from foo where rand()<0.02 distribute by rand() sort by rand() limit100

例四:
上面进行了俩次随机,本方法只进行一次随机效率快于上面
select *from foo where rand()<0.02 cluster by rand() limit 100;

=======
动态分区抽样,显示分区信息
set hive.exec.dynamic.partition=true
set hive.exec.dynamic.partition.mode=nonstrict
selece *from foo tablesample(bucket 1 out of 10 on rank())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值