pyspark 将一个RDD列表Map到一个有两个参数的函数

hsvhsicv  于 2023-05-16  发布在  Spark
关注(0)|答案(1)|浏览(192)

我有一个功能,比较图像从同一个文件夹,对自己-与输出的相似性预测。该函数在python中运行良好,但我想利用pyspark parellelisation的功能。
在这里,我通过简单地并行化列表来使用Spark。把它变成RDD。

img_list = sc.parallelize(os.listdir(folder_dir))
f_img_list = img_list.filter(lambda f: f.endswith('.jpg') or f.endswith('.png'))

定义函数:

def compare_images(x1,x2):
  #Preprocess images
  img_array1 = preprocess_image2(x1)
  img_array2 = preprocess_image2(x2)

  pred = compare(img_array1 , img_array2)
  return pred

在这一点上,我想应用RDD上的操作,并要求文件夹中的图像不应与其自身进行比较。
我的尝试是使用“Map”,但我不确定如何做到这一点。下面是我的尝试,但只假设一个参数:

prediction = f_img_list.map(compare_images)
prediction.collect()

我也知道,我的尝试不包括图像不应相互比较的要求-协助也将不胜感激。

xytpbqjk

xytpbqjk1#

您可以创建一个不同图像文件名对的列表,然后并行化该列表,还可以修改compare_images函数以接受单个参数而不是两个参数。
edit:让我们尝试使用RDD的filter方法来过滤掉以'.jpg'或'.png'结尾的文件

import os
import itertools
from pyspark import SparkContext

sc = SparkContext()

def preprocess_image2(image_path):
    pass

def compare(img_array1, img_array2):
    pass

img_list = sc.parallelize(os.listdir(folder_dir))
f_img_list = img_list.filter(lambda f: f.endswith('.jpg') or f.endswith('.png'))
f_img_list_local = f_img_list.collect()
image_pairs = list(itertools.combinations(f_img_list_local, 2))
image_pairs_rdd = sc.parallelize(image_pairs)

def compare_images(image_pair):
    x1, x2 = image_pair
    img_array1 = preprocess_image2(x1)
    img_array2 = preprocess_image2(x2)
    pred = compare(img_array1, img_array2)
    return pred

predictions = image_pairs_rdd.map(compare_images)
results = predictions.collect()

相关问题