2016-12-19 9 views
0

df.randomSplit()を使用していますが、等しい行に分割していません。私はそれを達成することができる他の方法はありますか?等価レコードでスパークデータフレームを分割する方法

+0

randomSplitは、ほぼ同じサイズのデータ​​セットを返す必要があります。何が問題ですか?正確に同じ行数のデータセットが必要ですか? –

+0

私は各分割に1をウェイトとして渡しています。 df_splits = event_df.randomSplit(([1.0,1.0,1.0,1.0]))。これを最適化して同数のレコードを取得することが可能ですか? –

+0

これはランダムベースのサンプリング戦略を使用しているため、結果は常に近似しています。正確に同じサイズのデータ​​フレームを取得するには、いくつかの順序付けを含み、複数のwhereステートメントを使用する必要があります。これはかなり遅くなります(ランダムではありません)。 –

答えて

0

私のケースでは、特定のクロス検証実験を実行するために、バランスの取れた(等しいサイズの)パーティションが必要でした。そのために

通常、あなたは:

  1. このステップの後のデータセット
  2. 倍に各要素を割り当てるにはモジュラス演算を適用します(パーティション)

をランダムあなたは、各パーティションを抽出する必要がありますfilter、afaikを使用すると、1つのRDDを多くのものに分割する変換はまだありません。 Scalaではいくつかのコードであることは、Pythonに適応するのは簡単でなければなりませんので、それが唯一の標準スパーク操作を使用しています。ここ

:あなたは同じ重みを渡すと

val npartitions = 3 

val foldedRDD = 
    // Map each instance with random number 
    .zipWithIndex 
    .map (t => (t._1, t._2, new scala.util.Random(t._2*seed).nextInt())) 
    // Random ordering 
    .sortBy(t => (t._1(m_classIndex), t._3)) 
    // Assign each instance to fold 
    .zipWithIndex 
    .map(t => (t._1, t._2 % npartitions)) 

val balancedRDDList = 
    for (f <- 0 until npartitions) 
    yield foldedRDD.filter(_._2 == f) 
関連する問題