Java 使用Spark将图像文件保存到HDFS
我有一个图像文件Java 使用Spark将图像文件保存到HDFS,java,apache-spark,hdfs,Java,Apache Spark,Hdfs,我有一个图像文件 image = JavaSparkContext.binaryFiles("/path/to/image.jpg"); 我想处理,然后使用Spark将二进制信息保存到HDFS类似于: image.saveAsBinaryFile("hdfs://cluster:port/path/to/image.jpg") 这是可能的,不是说“那么简单”,只是可能做到这一点吗?如果是这样,你会怎么做。尽量保持一对一,就像保持扩展名和类型一样,因此如果我使用hdfs命令行直接下载,它仍然是
image = JavaSparkContext.binaryFiles("/path/to/image.jpg");
我想处理,然后使用Spark将二进制信息保存到HDFS类似于:
image.saveAsBinaryFile("hdfs://cluster:port/path/to/image.jpg")
这是可能的,不是说“那么简单”,只是可能做到这一点吗?如果是这样,你会怎么做。尽量保持一对一,就像保持扩展名和类型一样,因此如果我使用hdfs命令行直接下载,它仍然是一个可行的图像文件。是的,这是可能的。但是您需要一些数据序列化插件,例如avro() 假设图像在程序中显示为二进制(字节[]),因此图像可以是
数据集
。
您可以使用
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();
}
}
是的,这是可能的。但是您需要一些数据序列化插件,例如avro() 假设图像在程序中显示为二进制(字节[]),因此图像可以是
数据集
。
您可以使用
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();
}
}
是的,我的图像是一个byte[]我在我的原始问题中添加了一点,保留了扩展名和类型。这是我正在考虑的选项之一,但这确实需要hadoop库。作为一个挑战,我正试图让Spark来写这个文件。我尝试了你的第一种方法,并取得了成功(没有直接下载的能力)。我不确定“需要hadoop库”是什么意思。实际上,spark core的依赖关系隐式导入了hadoop客户端的依赖关系。如果一切顺利,您应该能够导入org.apache.hadoop.fs.{FileSystem,Path},而无需在pom中进行任何修改。sparkcontext是不可序列化的,因此您不能使用第二种方法。是的,我的图像是一个byte[]我在原始问题中添加了一点,保留扩展和类型。这是我正在考虑的选项之一,但这确实需要hadoop库。作为一个挑战,我正试图让Spark来写这个文件。我尝试了你的第一种方法,并取得了成功(没有直接下载的能力)。我不确定“需要hadoop库”是什么意思。实际上,spark core的依赖关系隐式导入了hadoop客户端的依赖关系。如果一切顺利,您应该能够导入org.apache.hadoop.fs.{FileSystem,Path},而无需在pom中进行任何修改。