关于Spark Scala中数据的火车测试拆分

时间:2020-04-09 05:29:13

标签: scala apache-spark

我有一个这样的Spark Scala数据框

    val df = Seq(
  (10, 12),
  (44, 14),
  (32, 25),
  (31, 24),
  (75, 25),
  (80, 20),
  (35, 55),
  (32, 25),
  (67, 72),
  (32, 21)
).toDF("x1","x2")

df.show()

+---+---+
| x1| x2|
+---+---+
| 10| 12|
| 44| 14|
| 32| 25|
| 31| 24|
| 75| 25|
| 80| 20|
| 35| 55|
| 32| 25|
| 67| 72|
| 32| 21|
+---+---+

我需要将此数据分为训练和测试,其中训练数据将是前8行(80%),测试数据将是后2行(20%)。

我尝试过val Array(train, test) = df.randomSplit(Array(0.8, 0.2)),但是它是随机选择8行(而不是选择前8行)作为训练,而其他选择作为测试

所以有人可以建议如何选择我上面提到的分区吗?

谢谢

1 个答案:

答案 0 :(得分:2)

也许有更好的方法,但是当您需要对数据进行排序时,我想到的没什么。

val cnt = df.count
val testSize = (0.2 * cnt).toInt
val trainSize = cnt - testSize

val trainDf = df.sort(monotonically_increasing_id).limit(trainSize)
val testDf = df.sort(monotonically_increasing_id.desc).limit(testSize)