Hive
の- documentation は、LIMIT
句returns rows chosen at random
に注意します。 800,000
を含むLIMIT 1
レコードを超えるテーブルでSELECT
テーブルを実行していますが、常に同じレコードが返されます。
私はShark
ディストリビューションを使用していますが、これが予期しない動作と関係があるのではないかと思っています。どんな考えでもいただければ幸いです。
ありがとう、Visakh
ドキュメントにはランダムに行を返すと記載されていますが、実際にはそうではありません。
Where/order by句なしでデータベースに表示される「ランダムに選択された行」を返します。つまり、行が返される順序を決定できないというだけで、実際にはランダムではありません(またはランダムに選択されています)。
そこに_order by x DESC limit 5
_をたたくと、選択したものの最後の5行が返されます。
ランダムに返される行を取得するには、次のようなものを使用する必要があります:order by Rand() LIMIT 1
ただし、インデックスが適切に設定されていない場合、速度に影響する可能性があります。通常、テーブルのIDを取得するために最小/最大を実行し、それらの間で乱数を実行してから、それらのレコードを選択します(この場合、1つのレコードだけです)。これは、データベースに実行させるよりも速い傾向があります。特に大規模なデータセットでの作業
安全に使用したい
表から選択*
rand()で配布
rand()で並べ替え
上限10000;
この質問が最初に投稿された2014年以降、ドキュメントは更新されている可能性がありますが、2017年12月現在、ドキュメントには「次のクエリは5人の任意の顧客を返します」と表示されています。
この場合、「任意」とは、選択方法が確定的ではないか、文書化するのに手間がかからないことを意味します。つまり、レコードの特定のサブセットを取得するための信頼性の高い方法として(たとえば、サンプリングのために)それに頼るべきではありません。便宜を図り、小さい結果セットをできるだけ早く取得したい場合(QA目的など)は、Order By句なしでLimit句のみを使用する必要があります。それ以外の場合は、必要に応じて、[並べ替え]、[クラスター]、または[配布]/[並べ替え]のいずれかを使用します。