在Spark / Scala中写入HDFS读取zip文件

时间:2017-02-17 10:01:23

标签: scala apache-spark hdfs

我正在写一个spark / scala程序来读取ZIP文件,解压缩它们并将内容写入一组新文件。我可以将其用于写入本地文件系统,但是想知道是否有办法将输出文件写入分布式文件系统(如HDFS)。代码如下所示

import java.util.zip.ZipInputStream
import org.apache.spark.input.PortableDataStream
import java.io._

var i =1
sc.binaryFiles("file:///d/tmp/zips/").flatMap((file:(String, PortableDataStream)) => {   
   val zipStream = new ZipInputStream(file._2.open)            
   val entry = zipStream.getNextEntry                            
   val iter = scala.io.Source.fromInputStream(zipStream).getLines          
   val fname = f"/d/tmp/myfile$i.txt" 

   i = i + 1

   val xx = iter.mkString
   val writer = new PrintWriter(new File(fname))
   writer.write(xx)
   writer.close()

   iter                                                       
}).collect()

`

3 个答案:

答案 0 :(得分:4)

您可以使用hadoop-common库轻松地将数据写入HDFS(如果您使用sbt作为依赖管理工具,请将该库添加到您的依赖项中)。有了它,您可以创建 FileSystem 对象:

 private val fs = {
    val conf = new Configuration()
    FileSystem.get(conf)
  }

确保使用hadoop集群信息(core-site.xml等)配置FileSystem

然后你可以在HDFS上编写一个String to path(在你的情况下你应该处理流),如下所示:

@throws[IOException]
  def writeAsString(hdfsPath: String, content: String) {
    val path: Path = new Path(hdfsPath)
    if (fs.exists(path)) {
      fs.delete(path, true)
    }
    val dataOutputStream: FSDataOutputStream = fs.create(path)
    val bw: BufferedWriter = new BufferedWriter(new OutputStreamWriter(dataOutputStream, "UTF-8"))
    bw.write(content)
    bw.close
  }

答案 1 :(得分:0)

您应该从官方文档中查看saveAsTextFile方法:http://spark.apache.org/docs/latest/programming-guide.html

它将允许您保存到HDFS:

iter.saveAsTextFile("hdfs://...")

答案 2 :(得分:0)

您可以尝试saveAsTextFile方法。

  

将数据集的元素作为文本文件(或文本文件集)写入本地文件系统,HDFS或任何其他Hadoop支持的文件系统的给定目录中。 Spark将在每个元素上调用toString,将其转换为文件中的一行文本。

它会将每个分区保存为不同的文件,除非您重新分区或合并,否则您最终得到的分区数将与输入文件的数量相同。