【发布时间】:2017-11-08 20:49:40
【问题描述】:
我在 HDFS 中有一个文件,其中包含各种其他文件的路径。这是名为 file1 的文件:
path/of/HDFS/fileA
path/of/HDFS/fileB
path/of/HDFS/fileC
.
.
.
我在 Scala Spark 中使用如下的 for 循环来读取上述文件的每一行并在另一个函数中处理它:
val lines=Source.fromFile("path/to/file1.txt").getLines.toList
for(i<-lines){
i.toString()
val firstLines=sc.hadoopFile(i,classOf[TextInputFormat],classOf[LongWritable],classOf[Text]).flatMap {
case (k, v) => if (k.get == 0) Seq(v.toString) else Seq.empty[String]
}
}
当我运行上述循环时,它会运行而不会返回任何错误,并且我会在新行中得到 Scala 提示:scala>
但是,当我尝试查看应该存储在 firstLines 中的几行输出时,它不起作用:
scala> firstLines
<console>:38: error: not found: value firstLines
firstLine
^
上面的循环没有产生输出,但是运行没有任何错误的问题是什么?
其他信息 函数 hadoopFile 接受一个字符串路径名作为它的第一个参数。这就是为什么我试图将 file1 的每一行(每一行是一个路径名)作为第一个参数 i 中的字符串传递。 flatMap 功能正在获取已传递给 hadoopFile 的文件的第一行并将其单独存储并转储所有其他行。因此,所需的输出(firstLines)应该是通过路径名(i)传递给 hadoopFile 的所有文件的第一行。
我尝试只为单个文件运行该函数,没有循环,这会产生输出:
val firstLines=sc.hadoopFile("path/of/HDFS/fileA",classOf[TextInputFormat],classOf[LongWritable],classOf[Text]).flatMap {
case (k, v) => if (k.get == 0) Seq(v.toString) else Seq.empty[String]
}
scala> firstLines.take(3)
res27: Array[String] = Array(<?xml version="1.0" encoding="utf-8"?>)
fileA 是一个 XML 文件,因此您可以看到该文件的第一行结果。所以我知道该函数工作正常,这只是我无法弄清楚的循环问题。请帮忙。
【问题讨论】:
标签: scala hadoop apache-spark hdfs