在使用binaryFile加载二进制文件之后,得到的是包含[String,PortableDataStream]的pair的RDD。我继续对得到的RDD使用map,使用PortableDataStream的toArray方法得到二进制文件转换之后的Byte数组。有如下几个问题:
1,我该如何我该如何将这个Byte的数组按四个Byte合并为一个float?
2,这个portableDataStream是如何做到并行计算的?
3,生成的RDD如何保证如何存储为目标格式的HDFS文件格式,比如我要处理一张图片,调用savaAsTextFiles之后得到的是HDFS的文件格式,那么我在RDD中的数据是怎样的呢?
楼主刚开始学spark还望各位高手指教指教~~~ ^_^
请问楼主问题解决了吗?我最近也在做Spark处理图像文件,使用binaryFile加载后该如何处理呢?
1、binaryFile是以path下的文件并行处理的,RDD[String,PortableDataStream]中第一个String就是path/fileName。当然你也可以接着用repartition重新设定并行度。
2、按四个Byte生成float(假设每个文件的数据可以混淆处理(不能混淆的话,逻辑要复杂些,每步需要用文件名做key)):
import org.apache.hadoop.hbase.util.Bytes
sc.binaryFile($路径)
.map(_._2.toArray.groupd(4)) // 按4字节分组 RDD[Seq[Array[Byte]]],如果长度不能被4整除,最后一个byte数组将用0补位
.flatMap(_.Iterable) // 扁平化 RDD[Array[Byte]]
.repartition($分区数) // 根据需要,如果文件比较多,此步可省略
.map(Bytes.toFloat(_)) // RDD[byte(4)] => RDD[float]
题主这几个问题有结论了吧?能否说一下呢