嵌套嵌套火花并行化

时间:2019-03-31 05:39:42

标签: apache-spark pyspark

我正在尝试并行化Spark中的现有算法(以可扩展的方式)。我已针对问题进行了简化,但它看起来像这样:

for p in all_p:
    all_q = calculate1(p)

    results_for_p = []
    for q in all_q:
        results_for_p.append(calculate2(q))

    save_results(results_for_p)

基本上,我嵌套了for循环和两个我想并行运行的长时间运行的函数。但是,嵌套函数calculate2的参数的大小取决于每个p的大小。

我的尝试是使输入变平,以便让calculate2在all_q和all_p上一起运行:

rdd = sc.parallelize(all_p)
all_q_each_p = rdd.map(calculate1).collect()

# flatten output to something we can parallelize:
all_q_all_p = []
for all_q in all_q_each_p:
    all_q_all_p.append(all_q)

rdd = sc.parallelize(all_q_all_p)
res = rdd.map(calculate2).collect()

# How to do this?? 
collect_and_save_all_results(res)

如何以一种可以很好扩展的方式编写此代码?

1 个答案:

答案 0 :(得分:0)

这正是flatMap解决的问题的类型。 flatMap默认情况下会调整rdd的大小。

代码变得更加简单:

rdd = sc.parallelize(all_p)

rdd.flatMap(calculate1).map(
    lambda args: calculate2(*args)
).collect()