Написание функции flatMap в Spark и Python - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь написать функцию flatMap на языке python в понимании списка!

simpleRDD = sc.parallelize([2,3,4])
print(simpleRDD.map(lambda x:range(1, x)).collect())

и вывод такой:

[[1], [1, 2], [1, 2, 3]]

Я написал функцию Map следующим образом:это работает, это правильный путь?

def myRange(x):
    return [x for x in range(1,x)]

def myMap(func, myList):
    return [func(i) for i in myList]

print(myMap(myRange, [2, 3, 4]))

Но если я хочу написать flatMap и добиться того, что приведенный ниже код генерирует в spark, он не будет работать.

print(simpleRDD.flatMap(lambda x:range(1, x)).collect())

вывод:

[1, 1, 2, 1, 2, 3]

и это моя попытка, которая не работает.

def myRange(x):
    return [x for x in range(1,x)]

def myFlatMap(func, myList):
    return [*(func(i) for i in myList)]

print(myFlatMap(myRange , [2, 3, 4]))

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Вы можете использовать уменьшить:

flat_array = reduce((lambda arr1, arr2: arr1 + arr2), array_of_arrays)
0 голосов
/ 23 июня 2018

Способ записи списка flatMap заключается в использовании вложенного для цикла :

[j for i in myList for j in func(i)]
#      ^outer loop     ^inner loop

Где первый цикл - это внешний цикл, который проходит по myList, а второй цикл - это внутренний цикл, который проходит по сгенерированному списку / итератору на func и помещает каждый элемент в список результатов как плоский.

def myFlatMap(func, myList):
    return [j for i in myList for j in func(i)]

myFlatMap(myRange, [2,3,4])
# [1, 1, 2, 1, 2, 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...