无法使用 pyspark 同时[并行]读取图像

hik*_*ker 5 parallel-processing python-imaging-library apache-spark pyspark

我在一个目录中有 10 张 jpeg 图像。我想使用 pyspark 同时阅读所有这些内容。我尝试如下。

from PIL import Image


from pyspark import SparkContext, SparkConf    

conf = SparkConf()
spark = SparkContext(conf=conf)       

files = glob.glob("E:\\tests\\*.jpg")

files_ = spark.parallelize(files)    

arrs = []

for fi in files_.toLocalIterator():      

    im = Image.open(fi)
    data = np.asarray(im)
    arrs.append(data)

img = np.array(arrs)    
print (img.shape)
Run Code Online (Sandbox Code Playgroud)

代码无误地结束并打印出来img.shape;然而,它并没有并行运行。你可以帮帮我吗?

wer*_*ner 4

您可以使用rdd.map并行加载和转换图片,然后将rdd收集到 Python 列表中:

files = glob.glob("E:\\tests\\*.jpg")

file_rdd = spark.parallelize(files)

def image_to_array(path):
    im = Image.open(path)
    data = np.asarray(im)
    return data

array_rdd = file_rdd.map(lambda f: image_to_array(f))
result_list = array_rdd.collect()
Run Code Online (Sandbox Code Playgroud)

result_list现在是一个包含 10 个元素的列表,每个元素都是一个numpy.ndarray.

该函数image_to_array将在不同的 Spark 执行器上并行执行。如果你有一个多节点的Spark集群,你必须确保所有节点都可以访问E:\\tests\\.

收集数组后,可以继续处理

img = np.array(result_list, dtype=object)
Run Code Online (Sandbox Code Playgroud)