Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spark将图像文件保存到HDFS_Java_Apache Spark_Hdfs - Fatal编程技术网

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中进行任何修改。