Эквивалент PySpark flatMap в Python - PullRequest
0 голосов
/ 28 ноября 2018

Я искал функцию для выравнивания массива списков.Сначала я реализовал свое решение, используя функцию Apach Spark flatMap в системе RDD, но я бы хотел сделать это локально.Однако мне не удается найти эквивалент

samples = filtered_tiles.flatMap(lambda tile: process_tile(tile, sample_size, grayscale))

в Python 3. Есть ли обходной путь?

Формат массива:

samples = [(slide_num, sample)]

С уважением

1 Ответ

0 голосов
/ 28 ноября 2018

Вот пример 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.

...