Spark是否会通过数据传递多个withColumn?

ast*_*asz 4 scala apache-spark apache-spark-sql

当多个withColumn函数被链接时,Spark是否会对数据进行一次或多次传递?

例如:

val dfnew = df.withColumn("newCol1", f1(col("a")))
              .withColumn("newCol2", f2(col("b")))
              .withColumn("newCol3", f3(col("c")))
Run Code Online (Sandbox Code Playgroud)

哪里

  • df是我的输入DataFrame至少包含列a,b,c
  • dfnew输出DataFrame三个新列newCol1,newCol2,newCol3
  • f1,f2,f3有一些用户定义的函数或像蒙上了,等在我的项目列了一些火花的操作,我可以有甚至30独立的withColumn功能链接与foldLeft.

重要

我在这里假设f2不依赖于结果f1,f3而不依赖于f1和的结果f2.可以按任何顺序执行这些功能.任何功能都没有随机播放

我的观察

  • 所有功能都在同一个阶段
  • 添加new withColumn不会增加执行时间,从而怀疑通过数据传递额外的段落.
  • 我已经测试了例如SQLTransformer包含所有函数的select语句和SQLTransformer每个函数的多个独立函数,并且执行时间类似.

问题

  • 火花会通过数据进行一到三次传递,每次一次withColumn吗?
  • 它取决于功能类型f1,f2,f3?UDF与泛型Spark操作?
  • 如果功能f1,f2,f3在同一阶段内,这是否意味着他们是在同一个数据传递?
  • 段落的数量是否取决于功能内的随机播放?如果没有洗牌?
  • 如果我用withColumn函数链接函数foldLeft会改变段落的数量吗?
  • 我可以在同一个select_statement 中用三个SQLTransformers或只有一个SQLTransformer与所有三个转换做类似的事情.通过数据传递了多少?
  • 基本上没关系,执行的时间与1和3段相似?

Tza*_*har 5

火花会通过数据进行一到三次传递,每次传递一次吗?

Spark将通过数据"制作一段".为什么?由于火花实际上并没有做任何事情达到此代码时,它只是建立一个执行计划,这将告诉它什么时候做什么dfnew使用(即一些动作,例如count,collect,write等)就可以被执行.然后,它将能够为每个记录一次计算所有功能.

它取决于函数f1,f2,f3的类型吗?UDF与泛型Spark操作?

没有.

如果函数f1,f2,f3在同一个阶段内,是否意味着它们在同一个数据传递中?

是.

段落的数量是否取决于功能内的随机播放?如果没有洗牌?

几乎.首先,只要不使用缓存/检查点,数据上的段落数就是在生成的DataFrame 上执行的操作newdf.然后,每次shuffle意味着读取每个记录,可能在工作节点之间发送,可能写入磁盘,然后再次读取.

如果我用foldLeft链接withColumn函数会改变段落的数量吗?

不会.它只会改变上述计划的构建方式,但它不会影响该计划的外观(将是完全相同的计划),因此计算将保持不变.

我可以在同一个select_statement中使用三个SQLTransformer或只有一个SQLTransformer执行类似的操作.通过数据传递了多少?

同样,这不会有任何区别,因为执行计划将保持不变.

基本上没关系,执行的时间与1和3段相似?

不确定这意味着什么,但这样的声音是不正确的:执行时间主要是洗牌次数和动作次数的一个因素(假设相同的数据和相同的群集设置).