web-dev-qa-db-ja.com

Spark RDDで正確なサンプルサイズのサンプルを取得するには?

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に等しいサンプルを取得する方法を教えてください。どうもありがとうございました。

15
Carter

正確なサンプルが必要な場合は、試してみてください

_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になるはずです。これは、人口が十分に多い場合に機能する可能性があります。

27
Bhashit Parikh

別の方法は、最初にtakeSampleを取得し、次にRDDを作成することです。これは、大規模なデータセットでは時間がかかる場合があります。

sc.makeRDD(a.takeSample(false, 1000, 1234))
4
Laeeq