0
df.randomSplit()を使用していますが、等しい行に分割していません。私はそれを達成することができる他の方法はありますか?等価レコードでスパークデータフレームを分割する方法
df.randomSplit()を使用していますが、等しい行に分割していません。私はそれを達成することができる他の方法はありますか?等価レコードでスパークデータフレームを分割する方法
私のケースでは、特定のクロス検証実験を実行するために、バランスの取れた(等しいサイズの)パーティションが必要でした。そのために
通常、あなたは:
をランダムあなたは、各パーティションを抽出する必要があります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)
randomSplitは、ほぼ同じサイズのデータセットを返す必要があります。何が問題ですか?正確に同じ行数のデータセットが必要ですか? –
私は各分割に1をウェイトとして渡しています。 df_splits = event_df.randomSplit(([1.0,1.0,1.0,1.0]))。これを最適化して同数のレコードを取得することが可能ですか? –
これはランダムベースのサンプリング戦略を使用しているため、結果は常に近似しています。正確に同じサイズのデータフレームを取得するには、いくつかの順序付けを含み、複数のwhereステートメントを使用する必要があります。これはかなり遅くなります(ランダムではありません)。 –