在Apache Spark中处理后保存图像

时间:2018-12-06 04:26:34

标签: apache-spark python-imaging-library

我有一个Apache Spark应用程序,该应用程序在图像数据集上运行一系列转换并返回这些图像的图块。转换一切正常,但是当我将图像保存在本地时什么也没有发生。

def save_rdd_2_jpeg(rdd, save_dir):
    rdd.foreach(lambda sample_element: save_nonlabelled_sample_2_jpeg(sample_element, save_dir))

def save_nonlabelled_sample_2_jpeg(sample, save_dir):
    slide_num, img_value = sample
    filename = '{slide_num}_{hash}.jpeg'.format(
        slide_num=slide_num, hash=np.random.randint(1e4))
    filepath = os.path.join(save_dir, filename)
    save_jpeg_help(img_value, filepath)


def save_jpeg_help(img_value, filepath):
    print(filepath)
    dir = os.path.dirname(filepath)
    os.makedirs(dir, exist_ok=True)
    img = Image.fromarray(img_value.astype(np.uint8), 'RGB')
    #img.show()
    img.save(filepath)

我要将文件保存到的文件路径为data/train_256/1_6300.jpeg。此路径应使用

自动创建
dir = os.path.dirname(filepath)
    os.makedirs(dir, exist_ok=True)

如果我取消注释#img.show()行,则会打开图像。我真的不知道为什么它没有省钱。我的猜测是,由于应用程序在不同的路径(例如/usr/local/spark-2.4.0-bin-hadoop2.7/work/app-20181206041146-0000/0)中运行,所以我无法保存到该本地路径。

任何想法都在发生什么,我该如何解决?

1 个答案:

答案 0 :(得分:0)

Spark的行为符合预期, 如果要保存到本地,则必须将RDD收集到Array [Image]中,然后存储每个图像,

Collect实际上将所有数据带到驱动程序节点,在这种情况下,它将起作用,
已更新

sample_elements = rdd.collect();
for sample_element in sample_elements:
    save_nonlabelled_sample_2_jpeg(sample_element, save_dir);