Sql HIVE中的限制子句真的是随机的吗?

Sql HIVE中的限制子句真的是随机的吗?,sql,hive,hiveql,shark-sql,Sql,Hive,Hiveql,Shark Sql,HIVE的注意到LIMIT子句返回随机选择的行。我在一个表上运行了一个SELECT表,该表包含超过800000条LIMIT 1记录,但它总是返回相同的记录 我正在使用Shark发行版,我想知道这是否与这种不期望的行为有关?如有任何想法,将不胜感激 谢谢, Visakh尽管文档中声明它随机返回行,但事实并非如此 它返回数据库中显示的“随机选择的行”,不带任何where/ORDERBY子句。这意味着它并不像您所想的那样是随机的(或随机选择的),只是无法确定返回行的顺序 只要您在那里按x DESC l

HIVE的
注意到
LIMIT
子句
返回随机选择的行
。我在一个表上运行了一个
SELECT
表,该表包含超过800000条
LIMIT 1
记录,但它总是返回相同的记录

我正在使用
Shark
发行版,我想知道这是否与这种不期望的行为有关?如有任何想法,将不胜感激

谢谢,
Visakh

尽管文档中声明它随机返回行,但事实并非如此

它返回数据库中显示的“随机选择的行”,不带任何where/ORDERBY子句。这意味着它并不像您所想的那样是随机的(或随机选择的),只是无法确定返回行的顺序

只要您在那里按x DESC limit 5添加一个
order,它就会返回您从中选择的任何内容的最后5行

要获取随机返回的行,您需要使用如下命令:
orderbyrand()LIMIT 1


但是,如果索引设置不正确,它可能会对速度产生影响。通常,我会执行一个min/max来获取表上的ID,然后在它们之间执行一个随机数,然后选择那些记录(在您的情况下,只有一条记录),这往往比让数据库完成工作要快,尤其是在一个大数据集上,以确保您想要使用的安全

从表中选择*

按兰特分发()

按兰德排序()

上限为10000


自该问题最初于2014年发布以来,文档可能已经更新,但截至2017年12月,文档现在显示“以下查询返回5个任意客户”


在这种情况下,“任意”意味着选择的方法不是确定性的,或者可能不值得费心去记录。换句话说,您不应该指望它是获取特定记录子集(例如,用于采样)的可靠方法。如果您正在寻求方便,并且希望尽快获得一个小的结果集(例如,出于QA目的),则只应使用没有Order By子句的Limit子句。否则,请根据需要使用Order By、Cluster By或Distribute By/Sort By中的一种。

我不知道配置单元,因此我不会回答。在大多数RDBMS中,在使用LIMIT时声明的随机性是由于这样一个事实,即您获得的行取决于优化器决定如何获得它们。换句话说,如果需要特定的行,则需要显式地声明它(通常使用ORDERBY)。这并不意味着每次执行查询时引擎都在滚动,只是意味着您不能期望结果总是相同的。在这种情况下,您认为创建一个序列,分配给输出记录,然后随机选择一个更好吗?您知道从任何RDBMS检索真正随机记录的任何行业标准方法吗?似乎
HIVE
支持
RAND()
。因此,我认为通过执行
orderbyrand()
,然后执行
LIMIT 1
,就可以完成这项工作。谢谢你……我刚刚在
Shark
上看到了同样的情况,索引无论如何都不受支持。而且我的表是缓存的,所以现在性能不是问题…:-)您能解释一下这一点吗?这与
orderbyrand()
有何不同?