2017-09-13 84 views
1

是否可以通过将我的HDFS的URI作为File类的构造函数来创建文件实例?例如:使用指向HDFS的URI创建文件实例

val conf = new Configuration() 
conf.addResource(hdfsCoreSitePath) 
conf.addResource(hdfsHDFSSitePath) 

val uri = conf.get("fs.default.name") 
val file = new File(uri + pathtothefile) 

然后,与文件实例,我想访问与文件类如file.list()提供给返回一个字符串名称所表示的目录中的文件和目录的阵列功能的文件列表这个抽象的路径名。我试过了代码,但是它返回file.list()上的null

不推荐下面的方法,因为我正在为普通文件系统和hdfs编写相同的代码库以实现代码可重用。

val fileSystem = FileSystem.get(conf) 
val status = fileSystem.listStatus(new Path(filepath)) 
status.map(x => ... 

回答

0

指核心-site.xml文件可定期内置Java/Scala的文件API不会为HDFS文件工作。协议和实现太不同了。如第二个示例中所示,您必须使用Hadoop API来访问HDFS文件。

好消息是,Hadoop API 用于非HDFS文件(常规文件)。所以这段代码是可重用的。只需使用如下的URI:file:///foo/bar作为本地文件。

0

fs.default.name已弃用。尝试使用fs.defaultFS,并确保该物业在您使用下面的命令

conf.addResource(hdfsCoreSitePath) 

https://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/core-default.xml

+0

我提到的方法,VAL文件系统= FileSystem.get(CONF) VAL状态= fileSystem.listStatus(新路径(文件路径)) status.map(X => ... 这是工作,但对于一些原因,我试图使用val file = new File(uri + pathtothefile)这是不工作,我不知道uri文件只适用于正常的文件系统,但不是hdfs –