Spark RDDのrdd.sample()
functionは、fractionパラメーターが同じでも異なる数の要素を返すのはなぜですか?たとえば、私のコードが次のような場合:
val a = sc.parallelize(1 to 10000, 3)
a.sample(false, 0.1).count
コードの2行目を実行するたびに、1000以外の異なる数値が返されます。実際、1000の要素は異なる可能性がありますが、実際には毎回1000が表示されます。サンプルサイズが正確に1000に等しいサンプルを取得する方法を教えてください。どうもありがとうございました。
正確なサンプルが必要な場合は、試してみてください
_a.takeSample(false, 1000)
_
ただし、これはRDD
ではなく配列を返すことに注意してください。
a.sample(false, 0.1)
が同じサンプルサイズを返さない理由については、spark=はサンプルを取得するために Bernoulliサンプリング と呼ばれるものを内部的に使用するためです。 fraction
引数は、RDDの実際のサイズの割合を表すものではなく、母集団の各要素がサンプル用に選択される確率を表します。
母集団の各要素はサンプルに対して個別に考慮されるため、サンプルサイズは固定されず、二項分布に従います。
そして、それは本質的にその数が固定されていないことを意味しています。
最初の引数をtrue
に設定すると、 ポアソンサンプリング と呼ばれるものが使用されます。これは、非決定的な結果サンプルサイズにもなります。
更新
sample
メソッドを使いたければ、おそらくfraction
paramに大きな確率を指定してから、次のようにtake
を呼び出すことができます。
_a.sample(false, 0.2).take(1000)
_
これは、ほとんどの場合(必ずしも常にではありませんが)、サンプルサイズが1000になるはずです。これは、人口が十分に多い場合に機能する可能性があります。
別の方法は、最初にtakeSampleを取得し、次にRDDを作成することです。これは、大規模なデータセットでは時間がかかる場合があります。
sc.makeRDD(a.takeSample(false, 1000, 1234))