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()
有何不同?