首页 > 解决方案 > 以下是否在火花中为每一行的每个执行程序创建一个新对象?

问题描述

我有以下示例

class Add() { val adding = 2; def getVal = 1 + adding }
val a = List(1,2,3).toDF
a.filter(col("value") === new AddOne().getVal).show()

这会在每个执行程序上为每个行/数据点创建一个新对象(AddOne)吗?

标签: scaladataframeapache-sparkserialization

解决方案


不,它只会在驱动程序上创建一次。
这是===方法的简化代码

  def === (other: Any): Column = {
    val right = Literal.create(other)
    EqualTo(expr, right)
  }

expr你在哪里col("value")将被实际值替换并且right是可折叠的文字。

如果您有一些疑问,请使用df.explain(true)它将帮助您了解将要执行的操作。
在你的情况下:

== Parsed Logical Plan ==
'Filter ('value = 3)
+- LocalRelation [value#1]

推荐阅读