web-dev-qa-db-ja.com

HiveのLIMIT句は本当にランダムですか?

Hiveの-​​ documentation は、LIMITreturns rows chosen at randomに注意します。 800,000を含むLIMIT 1レコードを超えるテーブルでSELECTテーブルを実行していますが、常に同じレコードが返されます。

私はSharkディストリビューションを使用していますが、これが予期しない動作と関係があるのではないかと思っています。どんな考えでもいただければ幸いです。

ありがとう、Visakh

9
visakh

ドキュメントにはランダムに行を返すと記載されていますが、実際にはそうではありません。

Where/order by句なしでデータベースに表示される「ランダムに選択された行」を返します。つまり、行が返される順序を決定できないというだけで、実際にはランダムではありません(またはランダムに選択されています)。

そこに_order by x DESC limit 5_をたたくと、選択したものの最後の5行が返されます。

ランダムに返される行を取得するには、次のようなものを使用する必要があります:order by Rand() LIMIT 1

ただし、インデックスが適切に設定されていない場合、速度に影響する可能性があります。通常、テーブルのIDを取得するために最小/最大を実行し、それらの間で乱数を実行してから、それらのレコードを選択します(この場合、1つのレコードだけです)。これは、データベースに実行させるよりも速い傾向があります。特に大規模なデータセットでの作業

6
user3036342

安全に使用したい

表から選択*

rand()で配布

rand()で並べ替え

上限10000;

9
Keith

この質問が最初に投稿された2014年以降、ドキュメントは更新されている可能性がありますが、2017年12月現在、ドキュメントには「次のクエリは5人の任意の顧客を返します」と表示されています。

この場合、「任意」とは、選択方法が確定的ではないか、文書化するのに手間がかからないことを意味します。つまり、レコードの特定のサブセットを取得するための信頼性の高い方法として(たとえば、サンプリングのために)それに頼るべきではありません。便宜を図り、小さい結果セットをできるだけ早く取得したい場合(QA目的など)は、Order By句なしでLimit句のみを使用する必要があります。それ以外の場合は、必要に応じて、[並べ替え]、[クラスター]、または[配布]/[並べ替え]のいずれかを使用します。

3
Rick