工作中会遇到需要对一个大型表中的数据进行取样分析的问题,并不需要去跑mapreduce来取样,hive表中本身就提供了取样的相关函数。本文是对遇到的hive表中抽样问题,进行一个记录。
随机分桶抽样:
TABLESAMPLE (BUCKET 1 OUT OF 40 ON rand())
SELECT *
FROM tabelName1 TABLESAMPLE (BUCKET 1 OUT OF 40 ON rand())
WHERE column1='20210220' and column2='pagev'
上面的含义是从tabelName1表中选取满足where条件的数据中,按分桶随机抽样取1/40的数据。(得到的数据大概是符合条件数据的1/40,但是并不是严格的1/40).
数据块抽样
TABLESAMPLE (n PERCENT)
SELECT *
FROM mds_feature_project_sample_data_hour TABLESAMPLE (10 PERCENT)
WHERE dt='20210220' and cre_mod='tianyi_nspagev'
从符合where条件筛选的数据中抽取百分之10的数据。
参考:
http://lxw1234.com/archives/2015/08/444.htm
经验: 目的是随机抽取2.5d的日志数据,如果以TABLESAMPLE (BUCKET 20 OUT OF 100 ON uuid_sign)去采用容易导致数据采样有偏,对于头部用户(uuidsign)的数据处理要么过于倾向要么严重忽略,得出的结论并不可信,还是需要以记录条数去随机采样更可信。