当数据规模不断膨胀时,我们需要找到一个数据的子集来加快数据分析效率。因此我们就需要通过筛选和分析数据集为了进行模式 & 趋势识别。目前来说有三种方式来进行抽样:随机抽样,桶表抽样,和块抽样。
1 随机抽样(Random sampling):
使用 RAND()函数和 LIMIT
关键字来获得抽样数据。DISTRIBUTE
和 SORT
关键字在这里用来确保 mappers 和 reducers可以高效的使用随机分布的数据。 ORDER BY RAND()语句也可以达到同样目的,但是性能上会稍微差点。
SELECT * FROM <Table_Name> DISTRIBUTE BY RAND() SORT BY RAND()LIMIT <N rows to sample>; 有兴趣的朋友可以进一步参考博客: <Hive 中几种随机抽样对比>:http://www.tuicool.com/articles/MZFVFb
2 桶表抽样(Bucket table sampling):
它是一种桶表进行优化的抽样。
其中的 colname
值指定抽样数据的列, 在对整行抽样的时候可以同样可以使用RAND()函数。如果抽样字段跟 CLUSTERED BY 字段相同,TABLESAMPLE 语句会更加高效。它的语法如下所示:
SELECT * FROM <Table_Name>
TABLESAMPLE(BUCKET <specified bucket number to sample> OUT OF <total number of buckets> ON [colname|RAND()]) table_alias;
--示例<span style="font-size:12px;">jdbc:hive2://> SELECT name FROM employee_id_buckets . . . . . . .> TABLESAMPLE(BUCKET 1 OUT OF 2 ON rand()) a; +----------+ | name | +----------+ | Lucy | | Shelley | | Lucy | | Lucy | | Shelley | | Lucy | | Will | | Shelley | | Michael | | Will | | Will | | Will | | Will | | Will | | Lucy | +----------+ 15 rows selected (0.07 seconds)</span>
3 块抽样(Block sampling) :
它允许 Hive随机抽选 N 行数据 & (N%)百分比的数据量 & N 字节的数据。抽样的粒度是 HDFS Block 的大小。它的语法结构如下所示:
--按行抽样<span style="font-size:12px;">SELECT * FROM <Table_Name> TABLESAMPLE(N PERCENT|ByteLengthLiteral|N ROWS) s; -- ByteLengthLiteral -- (Digit)+ ('b' | 'B' | 'k' | 'K' | 'm' | 'M' | 'g' | 'G') </span>
<span style="font-size:12px;">jdbc:hive2://> SELECT name . . . . . . .> FROM employee_id_buckets TABLESAMPLE(4 ROWS) a; +----------+ | name | +----------+ | Lucy | | Shelley | | Lucy | | Shelley | +----------+ 4 rows selected (0.055 seconds)</span>
--根据数据比例大小来抽样
<span style="font-size:12px;">jdbc:hive2://> SELECT name . . . . . . .> FROM employee_id_buckets TABLESAMPLE(10 PERCENT) a; +----------+ | name | +----------+ | Lucy | | Shelley | | Lucy | +----------+ 3 rows selected (0.061 seconds)</span>
--根据数据大小进行抽样
<span style="font-size:12px;">jdbc:hive2://> SELECT name . . . . . . .> FROM employee_id_buckets TABLESAMPLE(3M) a; +----------+ | name | +----------+ | Lucy | | Shelley | | Lucy | | Shelley | | Lucy | | Shelley | | Lucy | | Shelley | | Lucy | | Will | | Shelley | | Lucy | | Will | | Shelley | | Michael | | Will | | Shelley | | Lucy | | Will | | Will | | Will | | Will | | Will | | Lucy | | Shelley | +----------+ 25 rows selected (0.07 seconds)</span>