在数据集上调用withColumn的成本是多少

时间:2017-12-12 13:17:22

标签: java apache-spark apache-spark-dataset

在与RDD合作的几个项目之后,我正盯着使用数据集。我正在使用Java进行开发。

据我所知,列是不可变的 - 列没有map函数,map列的标准方法是添加withColumn列。

我的问题是当我打电话给Column时真的发生了什么?有性能损失吗?我应该尝试尽可能少地拨打{{1}}电话,或者这不重要吗?

背驮式问题:当我调用任何其他行/列创建函数(例如explode或pivot)时,是否存在任何性能损失?

1 个答案:

答案 0 :(得分:1)

与DataFrame交互的各种功能的性能都足够快,你永远不会有问题(或者真的注意到它们)。

如果您了解spark如何执行您在驱动程序中定义的transormations,那么这将更有意义。当您调用各种转换函数( withColumn 选择等)时,Spark实际上并未立即执行任何操作。它只是记录您要在其执行计划中运行的操作。在您调用操作之前,Spark不会开始计算您的数据,通常是为了获得结果或写出数据。

了解您要运行的所有操作允许spark在实际运行之前对执行计划执行优化。例如,假设您使用 withColumn 来创建新列,但在将数据写入文件之前删除该列。 Spark知道它实际上不需要计算该列。

通常决定驱动程序性能的因素包括:

  1. 有多少广泛的转换(执行程序之间的数据混乱)以及正在洗牌的数据量
  2. 我是否有任何昂贵的转换功能
  3. 关于爆炸和枢轴的额外问题:

    • 爆炸创建新行,但这是一个狭窄的转换。它可以在不需要在执行程序之间移动数据的情况下更改分区。这意味着它的执行成本相对较低。如果拉斐尔在评论中指出你正在爆炸的阵列非常庞大,那就有一个例外。
    • Pivot需要groupBy操作,这是一个广泛的转换。它必须将数据从每个执行程序发送到每个其他执行程序,以确保给定键的所有数据都在同一个分区中。由于需要额外的网络流量,这是一项昂贵的操作。