在 scala Spark 中将训练和测试中的数据集拆分为一行

Gia*_*chi 2 scala apache-spark

我知道这不是很重要,但我想知道是否可以节省两行代码。

我有一个数据集 inputData,我想将其分成两部分。我正在使用数据集类的 randomSplit 方法。但是,我被迫使用三行代码来执行此操作:

    val sets = inputData.randomSplit(Array[Double](0.7, 0.3), 18)
    val training = sets(0)
    val test = sets(1)
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想做类似的事情

    val (training, test) = inputData.randomSplit(Array[Double](0.7, 0.3), 18)
Run Code Online (Sandbox Code Playgroud)

但由于错误,此代码无法编译:

Error:(146, 13) constructor cannot be instantiated to expected type;
found   : (T1, T2)
required: Array[org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]]
Run Code Online (Sandbox Code Playgroud)

有可能实现我想要的吗?

hi-*_*zir 5

模式匹配数组:

val Array(training, test) = inputData.randomSplit(Array[Double](0.7, 0.3), 18)
Run Code Online (Sandbox Code Playgroud)

或更长的(但仍然是单个表达式)

val (training, test) = inputData.randomSplit(Array[Double](0.7, 0.3), 18) match {
   case Array(training, test) => (training, test)   
}
Run Code Online (Sandbox Code Playgroud)

请记住这一点,它无法由编译器验证,并且可能在运行时失败MatchError