使用带有PERCENT的TABLESAMPLE将返回表中的所有记录

时间:2014-08-01 12:04:49

标签: amazon-web-services hive

我有一个小的 测试 表,其中包含两个字段 - id 名称,共19条记录。当我尝试使用以下查询从此表中获取10%的记录时,我获得所有记录。我试图在大表上执行此操作,但结果是相同的 - 返回所有记录。查询:

select * from test tablesample (10 percent) s;

如果我使用ROWS而不是TABLESAMPLE(即:select * from test tablesample (10 rows) s;,它可以正常工作,只返回10条记录。我怎样才能获得必要的记录百分比?

2 个答案:

答案 0 :(得分:0)

您可以将PERCENTTABLESAMPLE一起使用。例如:

SELECT * FR0M TABLE_NAME
TABLESAMPLE(1 PERCENT) T;

这将选择输入数据大小的1%,而不一定是行数。可以找到更多详细信息here

但是,如果您真的在寻找一种方法来选择行数的百分比,那么您可能必须使用LIMIT子句和您需要检索的记录数。

例如,如果您的表有1000条记录,那么您可以选择随机的10%记录:

select * from table_name order by rand() limit 100;

答案 1 :(得分:0)

您可以参考以下链接: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Sampling

您必须使用CombinedHiveOutputFormat,该格式不适用于ORC格式。因此,您将永远无法将百分比查询的输出保存到表中。

据我所知,最好的方法是使用rand()函数。但是同样,您不应将此命令与order by()子句一起使用,因为它会影响性能。这是我的高效示例查询:

SELECT * FROM table_name
WHERE rand() <= 0.0001
DISTRIBUTE BY rand()
SORT BY rand()
LIMIT 5000;

我在900M行表上对此进行了测试,并在2分钟内执行了查询。

希望这会有所帮助。