【发布时间】:2017-11-03 21:34:04
【问题描述】:
我在 HDFS 中有一个名为 file1 的文件,其中包含以下几行:(每一行都是一个目录路径)
this/is/path1
this/is/path2
this/is/path3
.
.
.
this/is/path1000ormore
我有一个 Scala Spark 函数如下:
val resultset=sc.hadoopFile(inputpath,classOf[TextInputFormat],classOf[LongWritable],classOf[Text]).flatMap {
case (k, v) => if (k.get == 0) Seq(v.toString) else Seq.empty[String]
}
我想在 hadoopFile 函数中传递来自“file1”的每一行来代替“inputpath”(需要是一个字符串),并获得每个迭代/循环的结果。 我该怎么做?
额外信息:
函数的实际作用: 上面的函数从指定的目录路径中获取第一个文件,而不是“inputpath”,并给出文件的第一行。我想对存储在“file1”中的所有目录路径执行此操作,因此我正在寻找有关如何在循环/迭代中执行此操作的解决方案。
更新: 我试着把它放在这样的循环中:
val lines=Source.fromFile("/path/to/file1.txt").getLines.toList
for(i<-lines){
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]
}
这运行了大约 10 分钟(文件 1 包含大约 34,000 行),并且没有导致任何错误。但是当我尝试使用以下命令查看几行输出时,
firstLines.take(3)
我收到一条错误消息:
error: not found: value firstLines
firstLines
^
所以我认为循环没有成功运行,因此 firstLines 从未被创建,尽管我不知道问题可能是什么。有人可以提供解决方案吗?
【问题讨论】:
-
你可以使用
sc.wholeTextFile("dir/path")。 -
@mrsrinivas 这就是我下一步所做的,但我不知道如何以循环方式成功地将这个文本文件的每一行传递给我的函数。该函数仅接受字符串值作为其“输入路径”参数,并且将整个文件作为一个字符串传递将不起作用,因为它需要是有效路径。文件的每一行都是有效的路径,但作为字符串的整个文件不是。
标签: scala hadoop apache-spark hdfs