从Hive表中进行数据抽样-Sampling

来源:互联网 发布:下拉框淘宝店铺 编辑:程序博客网 时间:2024/06/06 08:50

在Hive中提供了数据取样(SAMPLING)的功能,用来从Hive表中根据一定的规则进行数据取样,Hive中的数据取样支持分桶表取样和数据块取样。

16.1 数据块取样(Block Sampling)

  • block_sample: TABLESAMPLE (n PERCENT)

根据输入的inputSize,取样n%。

比如:输入大小为1G,TABLESAMPLE (50 PERCENT)将会取样512M的数据;

看例子:

表lxw1总大小约为64816816,总记录数为:2750714

bubuko.com,布布扣

使用下面的语句,从表lxw111中取样50%的数据,创建一个新表:

CREATE TABLE lxw1234 AS

SELECT * FROM lxw1 TABLESAMPLE (50 PERCENT);

完成后看看表lxw1234的记录数和大小:

bubuko.com,布布扣

结果表记录数:1376390,总大小:32432626,基本上是原表的50%。

  • block_sample: TABLESAMPLE (nM)

这种方式指定取样数据的大小,单位为M。

比如,下面的语句:

CREATE TABLE lxw1234_2 AS

SELECT * FROM lxw1 TABLESAMPLE (30M);

将会从表lxw1中取样30M的数据:

bubuko.com,布布扣

  • block_sample: TABLESAMPLE (n ROWS)

这种方式可以根据行数来取样,但要特别注意:这里指定的行数,是在每个InputSplit中取样的行数,也就是,每个Map中都取样n ROWS。

下面的语句:
SELECT COUNT(1) FROM (SELECT * FROM lxw1 TABLESAMPLE (200 ROWS)) x;

bubuko.com,布布扣

有5个Map Task(InputSplit),每个取样200行,一共1000行。

16.2 分桶表取样(Sampling Bucketized Table)

关于Hive中的分桶表(Bucket Table),在以后的文章中将会介绍,其实就是根据某一个字段Hash取模,放入指定数据的桶中,比如将表lxw1234按照ID分成100个桶,其算 法是hash(id) % 100,这样,hash(id) % 100 = 0的数据被放到第一个桶中,hash(id) % 100 = 1的记录被放到第二个桶中。分桶表在创建时候使用CLUSTER BY语句创建。

Hive中分桶表取样的语法是:

table_sample: TABLESAMPLE (BUCKET x OUT OF y [ON colname])

其中x是要抽样的桶编号,桶编号从1开始,colname表示抽样的列,y表示桶的数量。

例子1:

SELECT COUNT(1)

FROM lxw1 TABLESAMPLE (BUCKET 1 OUT OF 10 ON rand());

该语句表示将表lxw1随机分成10个桶,抽样第一个桶的数据;

前面介绍过,表lxw1总大小约为64816816,总记录数为:2750714

bubuko.com,布布扣

出来的结果基本上是原表的十分之一,注意:这个结果每次运行是不一样的,因为是按照随机数进行分桶取样的。

例子2

如果基于一个已经分桶表进行取样,将会更有效率。

执行下面的语句,创建一个分桶表,并插入数据:

CREATE TABLE lxw1_bucketed (pcid STRING)

CLUSTERED BY(pcid) INTO 10 BUCKETS;


INSERT overwrite TABLE lxw1_bucketed

SELECT pcid FROM lxw1;

表lxw1_bucketed按照pcid字段分成10个桶,下面的语句表示从10个桶中抽样第一个桶的数据:

SELECT COUNT(1) FROM lxw1_bucketed TABLESAMPLE(BUCKET 1 OUT OF 10 ON pcid);

很好理解。

再看这个:

SELECT COUNT(1) FROM lxw1_bucketed TABLESAMPLE(BUCKET 1 OUT OF 20 ON pcid)

表只有10个桶,如果指定20,看结果:

bubuko.com,布布扣

结果差不多是源表记录的1/20,Hive在运行时候,会在第一个桶中抽样一半的数据。

还有一点:

如果从源表中直接分桶抽样,也能达到一样的效果,比如:

SELECT COUNT(1) FROM lxw1 TABLESAMPLE(BUCKET 1 OUT OF 20 ON pcid);

区别在于基于已经分桶的表抽样,查询只会扫描相应桶中的数据,而基于未分桶表的抽样,查询时候需要扫描整表数据,先分桶,再抽样。

其它更详细的用法请参考Hive的官方文档说明。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 安卓6.0吃运行内存怎么办 小米手机王者荣耀录像不支持怎么办 win764位系统不兼容怎么办 安卓版本太高不兼容怎么办 安卓3.2.0不兼容怎么办 手机卡和手机不兼容怎么办 vivo手机下载吃鸡不兼容怎么办 vivox3t不兼容支付宝怎么办 移动sim卡坏了怎么办 cpu和主板不兼容怎么办 主板与cpu不兼容怎么办 cpu跟主板不兼容怎么办 软件与电脑不兼容怎么办 win8系统无限重启怎么办 安装微信旧版本登录提示升级怎么办 手机软件与系统不兼容怎么办 下载旧版本微信闪退登陆不了怎么办 企业微信一直登录失败怎么办 360浏览器9.1经常卡死怎么办 手机版爱奇艺看电影屏幕变小怎么办 找不到旧版本米聊怎么办 苹果id被锁了怎么办 新浪微博支付宝解绑失败怎么办 阿里妈妈升级看不到引流人数怎么办 阿里妈妈账号被冻结怎么办 微博昵称到次数怎么办 五星好评之后忘记截图了怎么办 评价后忘了截图怎么办 好评率太低不能买东西了怎么办 淘宝评价被删了怎么办 淘宝店铺有流量没有成交怎么办 淘宝好评被删了怎么办 淘宝评论被系统删除怎么办 淘宝被商家删除评价怎么办 淘宝评价管理商家删除了怎么办 淘宝商家删除评价我该怎么办 我的评价隐藏了怎么办 淘宝把评论删了怎么办 淘宝虚假交易被删除评价怎么办 淘宝好评评错了怎么办 被淘宝骗了好评怎么办