我有一个图片文件
image = JavaSparkContext.binaryFiles("/path/to/image.jpg");
我想处理,然后使用Spark将二进制信息保存到HDFS中
如下:
image.saveAsBinaryFile("hdfs://cluster:port/path/to/image.jpg")
这是可能的,不是说'那么简单',只是可以这样做吗?如果是这样你会怎么做如果可能的话,尽量保持一对一,保持扩展名和类型,所以如果我使用hdfs命令行直接下载,它仍然是一个可行的图像文件。
答案 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();
}
}