我正在尝试并行化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)
如何以一种可以很好扩展的方式编写此代码?
答案 0 :(得分:0)
这正是flatMap
解决的问题的类型。 flatMap
默认情况下会调整rdd的大小。
代码变得更加简单:
rdd = sc.parallelize(all_p)
rdd.flatMap(calculate1).map(
lambda args: calculate2(*args)
).collect()