14

说明该条款的文档。我一直在一个表上运行一个表,其中包含多个记录,但它总是返回相同的记录。HIVELIMITreturns rows chosen at randomSELECT800,000LIMIT 1

我正在使用该Shark发行版,我想知道这是否与这种意外行为有关?任何想法将不胜感激。

谢谢,维沙赫

4

3 回答 3

12

尽管文档声明它随机返回行,但实际上并非如此。

它返回“随机选择的行”,因为它出现在数据库中,没有任何 where/order by 子句。这意味着它并不像您想象的那样真正随机(或随机选择),只是无法确定返回行的顺序。

只要你order by x DESC limit 5在那里打 a,它就会返回你选择的任何内容的最后 5 行。

要随机返回行,您需要使用以下内容:order by rand() LIMIT 1

但是,如果您的索引设置不正确,它可能会对速度产生影响。通常我会做一个最小/最大来获取表上的 ID,然后在它们之间做一个随机数,然后选择那些记录(在你的情况下,只有 1 条记录),这往往比让数据库更快这项工作,尤其是在大型数据集上

于 2014-05-22T09:04:03.467 回答
10

为了安全起见,您要使用

从表中选择 *

通过 rand() 分发

按 rand() 排序

限制10000;

于 2015-03-16T11:28:37.153 回答
3

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

在这种情况下,“任意”意味着选择方法不是确定性的,或者可能不值得麻烦记录。换句话说,您不应该将其视为获取特定记录子集(例如,用于采样)的可靠方法。如果您正在寻找权宜之计并希望尽快获得一个小的结果集(例如,出于 QA 目的),您应该只使用没有 Order By 子句的 Limit 子句。否则,请酌情使用 Order By、Cluster By 或 Distribute By/Sort By 之一。

于 2017-12-13T17:51:06.473 回答