2016-09-06 14 views
2

私は、何千ものレコードを持つデータフレームを持っています。デモ用に別のデータフレームに1000行をランダムに選択したいと思います。 Javaでこれをどうやって行うことができますか?Spark DataFrame - ランダムなn行を選択する

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

+0

あなたはalredyスパークSQLを使用してHiveQLクエリを使用しようとしたことがありますか? –

+0

はい、ただし、関連性は表示されません。 –

+0

@Umberto質問は、n個の最初の行ではなくn個のランダムな行を取得することです。この質問の作成者は、独自のサンプリングを実装するか、またはSpark –

答えて

1

サンプル()メソッドを試すことができます。 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

  1. 、ないデータセット、あなたがしなければならないので:takeSampleはすべての値を収集します dataset.rdd.takeSample(0, 1000, System.currentTimeMilis()).toDF()
  2. 非常に多くの行を取得する場合は、takeSampleがドライバで結果を収集しているため、OutOfMemoryErrorに問題があることに注意してください。慎重
+0

この操作は大きなDFで高価になるため、データフレームを数えることなくそれを行う方法はありますか? – Hasson

+1

@Hasson DataFrameをキャッシュするようにしてください。そうすれば、2番目の処理がはるかに高速になります。またはapproxQuantile関数を使用することもできますが、それはより高速ですが精度は劣ります –

1

あなたが行をシャッフルして、トップのものを取ることができ、それを使用します。

import org.apache.spark.sql.functions.rand 

dataset.orderBy(rand()).limit(n)