我有一个包含java序列化对象的文件,例如“Vector”。我已将此文件存储在Hadoop分布式文件系统(HDFS)上。现在我打算在map任务中读取这个文件(使用方法readObject)。我想是
FileInputStream in = new FileInputStream("hdfs/path/to/file");
不会工作,因为文件存储在HDFS上。所以我想到了使用org.apache.hadoop.fs.FileSystem类。但不幸的是它没有任何返回FileInputStream的方法。它只有一个返回FSDataInputStream的方法,但我想要一个可以从文件中读取序列化java对象(如vector)的输入流,而不仅仅是FSDataInputStream可以执行的原始数据类型。
请帮忙!
答案 0 :(得分:6)
FileInputStream并不能直接读取序列化对象。您需要将其包装到ObjectInputStream中。您可以使用FSDataInputStream执行相同操作,只需将其包装到ObjectInputStream中,然后就可以从中读取对象。
换句话说,如果您fileSystem
类型为org.apache.hadoop.fs.FileSystem
,请使用:
ObjectInputStream in = new ObjectInputStream(fileSystem.open(path));
答案 1 :(得分:-2)
您需要像这样转换FSDataInputStream(scala代码)
val hadoopConf = new org.apache.hadoop.conf.Configuration()
val hdfs = org.apache.hadoop.fs.FileSystem.get(new java.net.URI("hdfs://nameserv"), hadoopConf)
val in = hdfs.open(new org.apache.hadoop.fs.Path("hdfs://nameserv/somepath/myfile")).asInstanceOf[java.io.InputStream]