2016-11-28 4 views
0

У меня есть файлСохранить файл изображения в HDFS с помощью Спарк

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

изображения Я хотел бы, чтобы обработать затем сохранить бинарную информацию, используя искру в HDFS

Что-то вроде:

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

Это возможно, не говоря «как просто», просто можно это сделать? если да, то как бы вы это сделали. Попытка сохранить один к одному, если это возможно, как в отношении продолжения и типа, поэтому, если я напрямую загружу с помощью командной строки hdfs, он все равно будет жизнеспособным файлом изображения.

ответ

1

Да, это возможно. Но вам нужен плагин для сериализации данных, например, avro (https://github.com/databricks/spark-avro).

Предположим, что изображение представлено как двоичное (байт []) в вашей программе, поэтому изображения могут быть Dataset<byte[]>. Вы можете сохранить его с помощью

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

images.avro будет папка содержит несколько разделов, и каждый раздел был бы Avro файл сохранения некоторых изображений.


Edit:

также возможно, но не рекомендуется для сохранения изображений, как отдельные файлы. Вы можете вызвать 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(); 
    } 
} 
+0

Да, мое изображение является байтом [] Я добавил немного к моему первоначальному вопросу, сохраняя расширения и тип. – JRhino

+0

Это один из вариантов, на который я смотрел, но для этого нужны библиотеки hadoop. В качестве задачи я пытаюсь заставить Spark написать файл. Я попытался использовать ваш первый метод и имел успех (предоставленный без возможности прямой загрузки). – JRhino

+0

Я не уверен, что означало «require hadoop libraries». На самом деле зависимость искрового ядра неявно импортирует зависимость hadoop-client. Если все пойдет хорошо, вы сможете импортировать org.apache.hadoop.fs. {FileSystem, Path} без каких-либо изменений в вашем pom. –

Смежные вопросы