Spark:合并转换是否有用?

时间:2017-03-26 13:26:15

标签: apache-spark rdd

我有一张图表来实现。有时我需要连续多次调用 map()函数。我有可能合并这些节点并只调用一个 map()

我的问题是它在运行时是否有用?调用转换(可能是开销)是否代价高昂?或者Spark是否借助谱系图来优化它?

日Thnx!

1 个答案:

答案 0 :(得分:3)

大部分时间答案都是否定的。对本地收藏品进行链接操作应该绰绰有余。细节因语言而异,但您可以假设Spark做得非常好,并且尽可能避免创建中间对象。

但是,有些情况下,您可以直接使用mapPartitions来编写函数或链接转换。请记住,每次转换都会扩展谱系,从而增加了处理DAG的成本。通常情况下,这可以通过使用检查点来切割谱系来解决,但它并不便宜。

所以如果你有很长的电话链:

rdd
  .map(f1)
  .map(f2)
  ...
  .map(fn)

您可以将其重写为:

rdd
  .mapPartitions(iter => iter
    .map(f1)
    .map(f2)
    ...
    .map(fn))

只有链式局部变换的数量很大时才值得拍摄。使用一些mapsfiltersflatMaps等),只会在不带来任何真正改进的情况下降低您的代码可读性。