我有一个小的 测试 表,其中包含两个字段 - id 和名称,共19条记录。当我尝试使用以下查询从此表中获取10%的记录时,我获得所有记录。我试图在大表上执行此操作,但结果是相同的 - 返回所有记录。查询:
select * from test tablesample (10 percent) s;
如果我使用ROWS而不是TABLESAMPLE(即:select * from test tablesample (10 rows) s;
,它可以正常工作,只返回10条记录。我怎样才能获得必要的记录百分比?
答案 0 :(得分:0)
您可以将PERCENT
与TABLESAMPLE
一起使用。例如:
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分钟内执行了查询。
希望这会有所帮助。