我有一张图表来实现。有时我需要连续多次调用 map()函数。我有可能合并这些节点并只调用一个 map()。
我的问题是它在运行时是否有用?调用转换(可能是开销)是否代价高昂?或者Spark是否借助谱系图来优化它?
日Thnx!
答案 0 :(得分:3)
大部分时间答案都是否定的。对本地收藏品进行链接操作应该绰绰有余。细节因语言而异,但您可以假设Spark做得非常好,并且尽可能避免创建中间对象。
但是,有些情况下,您可以直接使用mapPartitions
来编写函数或链接转换。请记住,每次转换都会扩展谱系,从而增加了处理DAG的成本。通常情况下,这可以通过使用检查点来切割谱系来解决,但它并不便宜。
所以如果你有很长的电话链:
rdd
.map(f1)
.map(f2)
...
.map(fn)
您可以将其重写为:
rdd
.mapPartitions(iter => iter
.map(f1)
.map(f2)
...
.map(fn))
只有链式局部变换的数量很大时才值得拍摄。使用一些maps
(filters
,flatMaps
等),只会在不带来任何真正改进的情况下降低您的代码可读性。