Source.fromFile不适用于HDFS文件路径

时间:2016-08-19 10:46:33

标签: scala hadoop apache-spark

我正在尝试从我的hdfs中读取文件内容,因为我正在使用 Source.fromFile()。当我的文件在本地系统中时工作正常但在我尝试从HDFS读取文件时抛出错误。

object CheckFile{
    def main(args:Array[String]) {
        for (line <- Source.fromFile("/user/cloudera/xxxx/File").getLines()) {
            println(line)
        }
    }
}

错误:

java.io.FileNotFoundException: hdfs:/quickstart.cloudera:8080/user/cloudera/xxxx/File (No such file or directory)

我搜索了但我无法找到任何解决方案。

请帮忙

2 个答案:

答案 0 :(得分:4)

如果您使用Spark,则应使用SparkContext加载文件。 Source.fromFile使用本地文件系统。

假设您SparkContext位于sc

val fromFile = sc.textFile("hdfs://path/to/file.txt")

应该做的伎俩。但是,您可能必须指定节点地址。

更新:

添加评论。您想要从hdfs读取一些数据并将其存储为Scala集合。这是不好的做法,因为文件可能包含数百万行,并且由于内存不足而会崩溃;您应该使用RDD而不是内置的Scala集合。不过,如果这是你想要的,你可以这样做:

val fromFile = sc.textFile("hdfs://path/to/file.txt").toLocalIterator.toArray

哪个会生成所需类型的本地集合(在这种情况下为Array)。

答案 1 :(得分:1)

insertRow <- function(df, rowindex) { if(rowindex<=nrow(df)){df[seq(rowindex+1,nrow(df)+1),] <- df[seq(rowindex,nrow(df)),] df[rowindex,] <- rep(NA,ncol(df)) return(df)} if(rowindex>=nrow(df)+1){df[nrow(df)+1,]<-rep(NA,ncol(df)) return(df)} } 将结果作为字符串