8

我有一个包含 java 序列化对象的文件,例如“Vector”。我已将此文件存储在 Hadoop 分布式文件系统 (HDFS) 上。现在我打算在其中一个地图任务中读取这个文件(使用方法 readObject)。我想

FileInputStream in = new FileInputStream("hdfs/path/to/file");

由于文件存储在 HDFS 上,因此无法正常工作。所以我想到了使用 org.apache.hadoop.fs.FileSystem 类。但不幸的是,它没有任何返回 FileInputStream 的方法。它所拥有的只是一个返回 FSDataInputStream 的方法,但我想要一个输入流,它可以从文件中读取序列化的 java 对象,如矢量,而不仅仅是 FSDataInputStream 会执行的原始数据类型。

请帮忙!

4

2 回答 2

6

FileInputStream不会让您方便地直接读取序列化对象。您需要将其包装到ObjectInputStream中。您可以对FSDataInputStream执行相同的操作,只需将其包装到ObjectInputStream中,然后您就可以从中读取对象。

换句话说,如果你有fileSystemtype org.apache.hadoop.fs.FileSystem,只需使用:

ObjectInputStream in = new ObjectInputStream(fileSystem.open(path));
于 2010-05-15T12:47:01.770 回答
-1

您需要像这样转换 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]
于 2016-12-13T16:10:10.927 回答