2016-11-28 2 views
0

Ich habe eine BilddateiSave Image-Datei auf HDFS mit Spark-

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

Ich mag dann verarbeiten, um die binären Informationen wie zu HDFS

Etwas mit Funken sparen:

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

Ist die möglich, nicht "so einfach" zu sagen, nur möglich, dies zu tun? Wenn ja, wie würdest du das machen? Versuchen Sie, eine Eins-zu-Eins zu halten, wenn Sie die Erweiterung und den Typ behalten, also wenn ich die hdfs-Befehlszeile direkt herunterlade, wäre es immer noch eine brauchbare Bilddatei.

Antwort

1

Ja, es ist möglich. Aber Sie benötigen ein Datenserialisierungs-Plugin, zum Beispiel avro (https://github.com/databricks/spark-avro).

Angenommen, das Bild wird in Ihrem Programm als binär (byte []) dargestellt, so dass die Bilder eine Dataset<byte[]> sein können. Sie können es

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

images.avro Verwendung speichern wäre ein Ordner mehrere Partitionen enthält und jede Partition würde eine Avro-Datei speichern einige Bilder sein.


Edit:

es auch möglich, aber nicht empfohlen, um die Bilder als separate Dateien zu speichern. Sie können foreach im Dataset aufrufen und HDFS api verwenden, um das Bild zu speichern.

siehe unten für ein Stück Code in Scala geschrieben. Sie sollten es in Java übersetzen können.

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

Ja, mein Bild ist ein Byte [] Ich habe ein wenig zu meiner ursprünglichen Frage hinzugefügt, behalten die Erweiterungen und Typ. – JRhino

+0

Dies ist eine der Optionen, die ich mir angesehen habe, aber das erfordert Hadoop-Bibliotheken. Als eine Herausforderung versuche ich, nur Spark zu bekommen, um die Datei zu schreiben. Ich habe deine erste Methode versucht und hatte Erfolg (ohne direkten Download-fähig). – JRhino

+0

Ich bin mir nicht sicher, was "require hadoop libraries" bedeutet. Tatsächlich importiert die Abhängigkeit von Spark-Core implizit die Abhängigkeit von hadoop-client. Wenn alles gut läuft, sollte es möglich sein, org.apache.hadoop.fs. {FileSystem, Path} ohne irgendwelche Änderungen in Ihrem Pom zu importieren. –

Verwandte Themen