使用Spark将图像文件保存到HDFS

时间:2016-11-28 20:36:49

标签: java apache-spark hdfs

我有一个图片文件

image = JavaSparkContext.binaryFiles("/path/to/image.jpg");

我想处理,然后使用Spark将二进制信息保存到HDFS中
如下:

image.saveAsBinaryFile("hdfs://cluster:port/path/to/image.jpg")

这是可能的,不是说'那么简单',只是可以这样做吗?如果是这样你会怎么做如果可能的话,尽量保持一对一,保持扩展名和类型,所以如果我使用hdfs命令行直接下载,它仍然是一个可行的图像文件。

1 个答案:

答案 0 :(得分:3)

是的,有可能。但是您需要一些数据序列化插件,例如avro(https://github.com/databricks/spark-avro)。

假设图像在程序中显示为二进制(byte []),因此图像可以是Dataset<byte[]>。 您可以使用

保存它
datasetOfImages.write()
  .format("com.databricks.spark.avro")
  .save("hdfs://cluster:port/path/to/images.avro");

images.avro将是一个包含多个分区的文件夹,每个分区都是一个avro文件,可以保存一些图像。

编辑:

也可以但不建议将图像保存为分隔文件。您可以在数据集上调用foreach并使用HDFS API保存图像。

请参阅下面的一段用Scala编写的代码。您应该能够将其翻译成Java。

import org.apache.hadoop.fs.{FileSystem, Path}

datasetOfImages.foreachPartition { images =>
  val fs = FileSystem.get(sparkContext.hadoopConfiguration)
  images.foreach { image =>
    val out = fs.create(new Path("/path/to/this/image"))
    out.write(image);
    out.close();
  }
}