Pyspark: распараллеливание UDF - PullRequest
0 голосов
/ 27 мая 2020

Я хочу l oop через два списка, передать комбинации в функцию и получить следующий результат:

ru = ['a', 'b', 'c']
ni = ['x', 'y', 'z']

def my_func(ru, ni):
    print("{} + {}".format(ru, ni))

for i in ru:
    for j in ni:
        my_func(i,j)

# Output

a + x
a + y
a + z
b + x
b + y
b + z
c + x
c + y
c + z

Поскольку это Pyspark, я хотел бы распараллелить его, так как каждая итерация функции может выполняться независимо.

Примечание. Моя фактическая функция - это длинный сложный алгоритм в pyspark. Просто хотел опубликовать простой пример для обобщения.

Как лучше всего это сделать?

1 Ответ

0 голосов
/ 29 мая 2020

Используйте cartesian:

ru = sc.parallelize(['a', 'b', 'c'])
ni = sc.parallelize(['x', 'y', 'z'])
print(ru.cartesian(ni).collect())

В вашем случае

ru.cartesian(ni).map(some_func)

Или:

def my_func(ru, ni):
    print("{} + {}".format(ru, ni))

ru.cartesian(ni).foreach(lambda t: my_func(t[0], t[1]))

a + z
a + y
a + x
b + y
b + x
b + z
c + y
c + x
c + z
...