web-dev-qa-db-ja.com

Spark DataFrame-n個のランダムな行を選択

数千のレコードを持つデータフレームがあり、デモ用に別のデータフレームに1000行をランダムに選択したいと思います。 Javaでこれを行うにはどうすればよいですか?

ありがとうございました!

12
lte__

サンプル()メソッドを試すことができます。 Unfourtunatellyあなたはそこに数ではなく、分数を与えなければなりません。次のような関数を書くことができます。

_def getRandom (dataset : Dataset[_], n : Int) = {
    val count = dataset.count();
    val howManyTake = if (count > n) n else count;
    dataset.sample(0, 1.0*howManyTake/count).limit (n)
}
_

説明:データの一部を取得する必要があります。 2000行あり、100行を取得する場合、合計行の0.5が必要です。 DataFrameにあるよりも多くの行を取得する場合は、1.0を取得する必要があります。 limit()関数が呼び出されて、丸めが正常であり、指定した行より多くの行を取得しなかったことを確認します。

編集:私は別の答えにtakeSampleメソッドを見ます。でも覚えておいて:

  1. これはデータセットではなくRDDのメソッドです。そのため、以下を実行する必要があります。dataset.rdd.takeSample(0, 1000, System.currentTimeMilis()).toDF() takeSampleはすべての値を収集します。
  2. 非常に多くの行を取得する場合は、takeSampleがドライバーで結果を収集しているため、OutOfMemoryErrorで問題が発生することに注意してください。慎重に使用してください
6
T. Gawęda

行をシャッフルしてから、一番上の行を取得できます。

import org.Apache.spark.sql.functions.Rand

dataset.orderBy(Rand()).limit(n)
23
apatry