7

randomSplit メソッドを使用してランダムに分割できることはわかっています。

val splittedData: Array[Dataset[Row]] = 
        preparedData.randomSplit(Array(0.5, 0.3, 0.2))

「nonRandomSplit メソッド」を使用して、データを連続した部分に分割できますか?

アパッチ スパーク 2.0.1。前もって感謝します。

UPD: データの順序は重要です。「ID が小さい」データでモデルをトレーニングし、ID が大きいデータでモデルをテストします。そのため、データをシャッフルせずに連続した部分に分割したいと考えています。

例えば

my dataset = (0,1,2,3,4,5,6,7,8,9)
desired splitting = (0.8, 0.2)
splitting = (0,1,2,3,4,5,6,7), (8,9)

私が考えることができる唯一の解決策は、countlimitを使用することですが、おそらくもっと良い方法があります。

4

1 に答える 1

7

これは私が実装したソリューションです: Dataset -> Rdd -> Dataset.

それが最も効果的な方法かどうかはわかりませんので、より良い解決策を喜んで受け入れます。

val count = allData.count()
val trainRatio = 0.6  
val trainSize = math.round(count * trainRatio).toInt
val dataSchema = allData.schema

// Zipping with indices and skipping rows with indices > trainSize.
// Could have possibly used .limit(n) here
val trainingRdd =
  allData
    .rdd
    .zipWithIndex()
    .filter { case (_, index) => index < trainSize }
    .map { case (row, _) => row }

// Can't use .limit() :(
val testRdd =
allData
  .rdd
  .zipWithIndex()
  .filter { case (_, index) => index >= trainSize }
  .map { case (row, _) => row }

val training = MySession.createDataFrame(trainingRdd, dataSchema)
val test = MySession.createDataFrame(testRdd, dataSchema)
于 2016-12-02T17:25:13.887 に答える