私は、何千ものレコードを持つデータフレームを持っています。デモ用に別のデータフレームに1000行をランダムに選択したいと思います。 Javaでこれをどうやって行うことができますか?Spark DataFrame - ランダムなn行を選択する
ありがとうございました!
私は、何千ものレコードを持つデータフレームを持っています。デモ用に別のデータフレームに1000行をランダムに選択したいと思います。 Javaでこれをどうやって行うことができますか?Spark DataFrame - ランダムなn行を選択する
ありがとうございました!
サンプル()メソッドを試すことができます。 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メソッドが表示されます。しかし、覚えている:RDDの方法It'a
dataset.rdd.takeSample(0, 1000, System.currentTimeMilis()).toDF()
。この操作は大きなDFで高価になるため、データフレームを数えることなくそれを行う方法はありますか? – Hasson
@Hasson DataFrameをキャッシュするようにしてください。そうすれば、2番目の処理がはるかに高速になります。またはapproxQuantile関数を使用することもできますが、それはより高速ですが精度は劣ります –
あなたが行をシャッフルして、トップのものを取ることができ、それを使用します。
import org.apache.spark.sql.functions.rand
dataset.orderBy(rand()).limit(n)
あなたはalredyスパークSQLを使用してHiveQLクエリを使用しようとしたことがありますか? –
はい、ただし、関連性は表示されません。 –
@Umberto質問は、n個の最初の行ではなくn個のランダムな行を取得することです。この質問の作成者は、独自のサンプリングを実装するか、またはSpark –