Сохранить изображение после обработки в Apache Spark - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть приложение 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 голосов
/ 07 декабря 2018

Spark работает правильно, как и должно быть. Если вы хотите сохранить локально, вы должны собрать RDD в массив [Image] и затем сохранить каждое изображение,

Collect фактически переносит все данные вузел драйвера, в этом случае это будет работать,
Обновлено

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