Вот пример PySpark flatMap
на СДР:
sc.parallelize([3,4,5]).flatMap(lambda x: range(1,x)).collect()
, который даст
[1, 2, 1, 2, 3, 1, 2, 3, 4]
, в отличие от map
, который даст [[1, 2], [1, 2, 3], [1, 2, 3, 4]]
(для сравнения).
flatMap
также делает только один уровень "unnesting".Другими словами, если у вас есть 3D-список, он сведет его только к 2-му списку.Итак, мы заставим наш инструмент для выравнивания делать то же самое.
Как уже упоминалось в комментариях, все, что вам нужно сделать, это вызвать встроенную функцию map
, создать функцию выравнивания и связать их вместе,Вот как:
def flatMap(f, li):
mapped = map(f, li)
flattened = flatten_single_dim(mapped)
yield from flattened
def flatten_single_dim(mapped):
for item in mapped:
for subitem in item:
yield subitem
возвращаясь к нашему примеру в качестве быстрой проверки работоспособности:
res = flatMap(lambda x: range(1, x), [3,4,5])
print(list(res))
, которая выдает:
[1, 2, 1, 2, 3, 1, 2, 3, 4]
по желанию.Вы бы сделали flatMap(lambda tile: process_tile(tile, sample_size, grayscale), filtered_tiles)
(учитывая, что filtered_tiles
является итеративным).
PS В качестве примечания вы можете запустить Spark в "локальном" режиме и просто вызвать flatMap
на RDD.Он отлично подойдет для создания прототипов небольших вещей на вашей локальной машине.Затем вы можете подключиться к кластеру с помощью некоторого менеджера кластеров, когда будете готовы к масштабированию и имеете ТБ данных, которые вам нужно скопировать.
HTH.