1

MPPマシン(現在はNetezza、後でhadoopなど)に格納されているテーブルからランダムな100行をサンプリングするためのソリューションのレビューが必要です。

後で同じサンプルを再現できるようにしたいので、Netezzaのrand()を使用することに興味はありません。また、setseed()を期待していません。

私が現在使用している解決策は次のとおりです。

SELECT * FROM MY_TABLE ORDER BY ID % 371, ID % 17, ID % 501, ID LIMIT 100

ここで、3つの数値は、私が自分のRNGによって生成している素数です。私は正しい方向に進んでいますか?この「ランダム」サンプルは十分にランダムですか?

注:暗号化された強力なランダムサンプルである必要はありません。毎回異なるサンプルを選択し、均一にサンプリングしていることを確認したいだけです。サンプルを簡単に再現できるようにしたいと思います(必要に応じて同じSQLを実行します。

ありがとう!

4

1 に答える 1

2

実際の乱数を取得し、テーブルまたはストアドプロシージャに貼り付けるのが非常に簡単な場合は、SQLで乱数を生成しようとはしません。

https://www.fourmilab.ch/hotbits/secure_generate.htmlにアクセスして、16進数で256のランダムビットを取得し、一度に4桁をグループ化し、10進整数に変換してから、最初の100個の数値をキーとして使用します。

繰り返し可能なシーケンスがあり、必要な数の真にランダムなシーケンスを作成できます。

一様分布の繰り返し可能な疑似乱数が必要な場合は、同じ原理が適用されます。数字には別のソースを使用してください。たとえば、付属のrandomモジュールを使用して数値を生成するPythonスクリプトを作成できます。

使用するSQLに関しては、DBを適切に構造化すれば簡単です。この場合、ランダムテーブルを1回作成し、それをクエリに複数回使用するため、生成される乱数だけでなく、主キーを含むテーブルを作成します。または、異なる数値のセットでこれを繰り返す場合は、乱数表をサンプリングしている表にリンクする関係テーブル(ERモデリングなど)を作成します。すべてをSQLに強制するのではなく、乱数表を生成し、スクリプト言語を使用して関係表を作成します。

上記の例では、100個のサンプルが必要です。したがって、ランダムサンプリングテーブルには、外部スクリプトによって選択された100個の主キーが含まれます。サンプリングを実行するたびに、ランダムサンプリングテーブルを変更するまで、まったく同じレコードを取得します。テーブルを変更するには、サンプリングするテーブルの主キーをダンプしてから、スクリプトを実行して、1から主キーの総数までの100の数値を生成することにより、ランダムに100を選択します。Pythonのようなツールを使用すると、均一な乱数、ガンマ分布、ガウス分布、対数正規分布、パレート分布などを取得できます。

于 2011-02-01T07:37:28.663 に答える