如何读取文件并在scala中拆分
how to read file and split in scala
如果我有一个文件(如 csv、txt...)。
我希望得到两个数组,例如
Array(Array(1.0,2.0),Array(4.0,5.0),Array(7.0, 8.0),Array(10.0,11.0),Array(13.0,14.0))
和
Array(3.0, 6.0, 9.0, 12.0, 15.0)
在 Scala 中执行此操作的理想方法是什么?
val rdd = sc.textFile("1.csv").map(_.split(',').map(_.trim().toDouble))
rdd.map(_.take(2)).collect()
res0: Array[Array[Double]] = Array(Array(1.0, 2.0), Array(4.0, 5.0), Array(7.0, 8.0), Array(10.0, 11.0), Array(13.0, 14.0))
rdd.map(_(2)).collect()
res2: Array[Double] = Array(3.0, 6.0, 9.0, 12.0, 15.0)
类似于 @Vitaliy Kotlyarenko 的回答,但没有使用像 Spark 这样的第三方(如果你的数据很大,Spark 就很棒,但否则就太过分了):
val lines: Iterator[String] = scala.io.Source.fromFile("txt.csv").getLines()
val matrix: Array[Array[Double]] = lines.map(_.split(",").map(_.trim.toDouble)).toArray
val twoFirstColumns: Array[Array[Double]] = matrix.map(_.take(2))
val thirdColumn: Array[Double] = matrix.map(_(2))
可以一次得到两个数组,这样就不用遍历两次数据了:
val (first, second) = {
io.Source.fromFile(name).getLines
.map(_.split(",").map(_.toDouble))
.foldRight(Seq.empty[Array[Double]] -> Seq.empty[Double]) {
case (Array(x, y, z), (as, bs)) => (Array(x, y) +: as, z +: bs)
}
}
现在,您最终得到两个列表而不是数组。其中,first.toArray
和 second.toArray
会为您进行转换。
如果我有一个文件(如 csv、txt...)。
我希望得到两个数组,例如
Array(Array(1.0,2.0),Array(4.0,5.0),Array(7.0, 8.0),Array(10.0,11.0),Array(13.0,14.0))
和
Array(3.0, 6.0, 9.0, 12.0, 15.0)
在 Scala 中执行此操作的理想方法是什么?
val rdd = sc.textFile("1.csv").map(_.split(',').map(_.trim().toDouble))
rdd.map(_.take(2)).collect()
res0: Array[Array[Double]] = Array(Array(1.0, 2.0), Array(4.0, 5.0), Array(7.0, 8.0), Array(10.0, 11.0), Array(13.0, 14.0))
rdd.map(_(2)).collect()
res2: Array[Double] = Array(3.0, 6.0, 9.0, 12.0, 15.0)
类似于 @Vitaliy Kotlyarenko 的回答,但没有使用像 Spark 这样的第三方(如果你的数据很大,Spark 就很棒,但否则就太过分了):
val lines: Iterator[String] = scala.io.Source.fromFile("txt.csv").getLines()
val matrix: Array[Array[Double]] = lines.map(_.split(",").map(_.trim.toDouble)).toArray
val twoFirstColumns: Array[Array[Double]] = matrix.map(_.take(2))
val thirdColumn: Array[Double] = matrix.map(_(2))
可以一次得到两个数组,这样就不用遍历两次数据了:
val (first, second) = {
io.Source.fromFile(name).getLines
.map(_.split(",").map(_.toDouble))
.foldRight(Seq.empty[Array[Double]] -> Seq.empty[Double]) {
case (Array(x, y, z), (as, bs)) => (Array(x, y) +: as, z +: bs)
}
}
现在,您最终得到两个列表而不是数组。其中,first.toArray
和 second.toArray
会为您进行转换。