当数据集比较大时,可能需要通过采集一部分数据集进行分析,称之为采样。在HQL中支持三种方式的采样:随机采样(random sampling)、分桶表采样(bucket table sampling)以及块采样(block sampling)。
1.随机采样
随机采样使用rand()函数和limit关键字。其中distribute和sort关键字用来保证抽取的数据是随机分布的,这种方式比较有效率。order by rand()也可以实现上述的功能,但是性能不好。
例子:
SELECT
name
FROM employee
DISTRIBUTE BY rand() SORT BY rand()
LIMIT 2;
2.分桶表采样
这是一种特殊的抽样方法,适用于分桶表,并做了优化。SELECT语句指定要采样的具体列 ,当需要采样整行时,可以使用rand()函数。如果采样的列与CLUSTERED BY 列(即分桶列)相同,则采样的效率会更高。
注:tablesample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y) 。
y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。例如,table总共分了4桶,当y=2时,抽取(4/2=)2个bucket的数据,当y=8时,抽取(4/8