首页 > 解决方案 > Pyspark:并行化 UDF

问题描述

我想遍历两个列表,将组合传递给一个函数,并获得以下输出:

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 中一个很长的复杂算法。只是想发布一个简单的例子来概括。

做这个的最好方式是什么?​</p>

标签: pysparkparallel-processingapache-spark-sqlpyspark-dataframes

解决方案


使用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

推荐阅读