从HDFS读取文件并将内容分配给字符串

时间:2017-06-15 13:55:17

标签: scala hadoop hdfs

在Scala中,如何读取HDFS中的文件并将内容分配给变量。我知道如何读取文件,我可以打印它。但是,如果我尝试将内容分配给字符串,它将输出作为Unit()。以下是我试过的代码。

 val dfs = org.apache.hadoop.fs.FileSystem.get(config);
 val snapshot_file = "/path/to/file/test.txt"
val stream = dfs.open(new Path(snapshot_file))
 def readLines = Stream.cons(stream.readLine, Stream.continually( stream.readLine))
readLines.takeWhile(_ != null).foreach(line => println(line))

以上代码正确打印输出。但是,如果我尝试将输出分配给字符串,我的输出正确。

val snapshot_id = readLines.takeWhile(_ != null).foreach(line => println(line))
snapshot_id: Unit = ()

将内容分配给变量的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

您需要使用mkString。由于println会返回Unit(),如果您在流媒体上调用println,该val hdfs = org.apache.hadoop.fs.FileSystem.get(new java.net.URI("hdfs://namenode:port/"), new org.apache.hadoop.conf.Configuration()) val path = new org.apache.hadoop.fs.Path("/user/cloudera/file.txt") val stream = hdfs.open(path) def readLines = scala.io.Source.fromInputStream(stream) val snapshot_id : String = readLines.takeWhile(_ != null).mkString("\n") 会存储到您的变量中

{{1}}

答案 1 :(得分:1)

我使用org.apache.commons.io.IOUtils.toString将流转换为字符串

def getfileAsString( file: String): String = {
      import org.apache.hadoop.fs.FileSystem
      val config: Configuration = new Configuration();
      config.set("fs.hdfs.impl", classOf[DistributedFileSystem].getName)
      config.set("fs.file.impl", classOf[LocalFileSystem].getName)
      val dfs = FileSystem.get(config)
      val filePath: FSDataInputStream = dfs.open(new Path(file))
      logInfo("file.available " + filePath.available)
      val outputxmlAsString: String = org.apache.commons.io.IOUtils.toString(filePath, "UTF-8")
      outputxmlAsString
    }