在这种情况下,我创建了一个包含100行的配置单元表“test”。当我启动hive终端并输入以下sql
select * from test tablesample(2 percent);
它返回3行数据;但是当我添加“createtableasselect”时,就像下面这样。
create table sample as select * from test tablesample(2 percent);
我发现“sample”表中有100行。我不知道为什么。谢谢。
1l5u6lss1#
文件上说 TABLESAMPLE (n PERCENT) 将允许配置单元选取至少n%的数据大小(注意,这并不一定意味着行数)作为输入。如果我们未能对其进行采样,mapreduce job的输入将是整个表/分区。我们在hdfs块级进行,因此采样粒度是块大小。例如,如果块大小是256mb,即使输入大小的n%只有100mb,也会得到256mb的数据。不幸的是,它不能保证每次获取相同的块,总行数可能会有所不同。我建议增加百分比 limit n 以保证返回n行。或者干脆用 limit n :
TABLESAMPLE (n PERCENT)
limit n
select * from test tablesample(5 percent) limit 100; --may perform faster
或者
select * from test limit 100;
limit的执行效率当然比tablesample低,因为limit在reducer上起作用,也许tablesample和limit的组合将允许可接受的性能。
1条答案
按热度按时间1l5u6lss1#
文件上说
TABLESAMPLE (n PERCENT)
将允许配置单元选取至少n%的数据大小(注意,这并不一定意味着行数)作为输入。如果我们未能对其进行采样,mapreduce job的输入将是整个表/分区。我们在hdfs块级进行,因此采样粒度是块大小。例如,如果块大小是256mb,即使输入大小的n%只有100mb,也会得到256mb的数据。不幸的是,它不能保证每次获取相同的块,总行数可能会有所不同。
我建议增加百分比
limit n
以保证返回n行。或者干脆用limit n
:或者
limit的执行效率当然比tablesample低,因为limit在reducer上起作用,也许tablesample和limit的组合将允许可接受的性能。