【问题标题】:How to do non-random Dataset splitting on Apache Spark?如何在 Apache Spark 上进行非随机数据集拆分?
【发布时间】:2017-04-17 12:37:18
【问题描述】:

我知道我可以使用 randomSplit 方法进行随机拆分:

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

我可以用一些“nonRandomSplit 方法”将数据分成连续的部分吗?

Apache Spark 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,但可能有更好的解决方案。

【问题讨论】:

  • 请详细说明您的观点?使用 randomSplit 进行非随机拆分。我真的不明白
  • 你可以给 randomSplit 一个种子值,以确保每次都能得到相同的结果,但我不确定你的意思是不是这个
  • @eliasah 感谢您的反馈,我已经更新了我的问题。我实际上正在寻找一些有效的 dataset-partitioning-given-ratios 方法,请参阅示例。
  • @David 感谢您的反馈,我已经更新了我的问题。我实际上正在寻找一些有效的 dataset-partitioning-given-ratios 方法,请参阅示例。
  • 你知道小ID和大ID之间的界限吗?如果是这样,您可以过滤。如果没有,您可以估计百分位数,然后根据截止值进行过滤。

标签: apache-spark apache-spark-sql apache-spark-dataset apache-spark-2.0


【解决方案1】:

这是我实现的解决方案: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)

【讨论】:

    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 2015-09-23
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多