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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark是否会通过数据传递多个withColumn?相关的知识,希望对你有一定的参考价值。

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

例如:

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

哪里

  • df是我输入的DataFrame,至少包含a,b,c列
  • dfnew输出DataFrame有三个新列newCol1,newCol2,newCol3
  • f1f2f3是一些用户定义的函数或者像cast这样的列上的一些spark操作。在我的项目中,我甚至可以使用withColumn链接30个独立的foldLeft函数。

重要

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

我的观察

  • 所有功能都在同一个阶段
  • 添加新的withColumn不会增加执行时间,从而怀疑通过数据传递额外的段落。
  • 我已经测试了单个SQLTransformer,其中select语句包含所有函数与多个单独的SQLTransformer,每个函数的执行时间相似。

问题

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

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

Spark将通过数据“制作一段”。为什么?因为当达到这个代码时,spark实际上没有做任何事情,它只是建立一个执行计划,告诉它在使用dfnew时要做什么(即某些动作,例如countcollectwrite等)。然后,它将能够为每个记录一次计算所有功能。

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

没有。

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

是。

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

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

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

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

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

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

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

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

以上是关于Spark是否会通过数据传递多个withColumn?的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark DataBricks 上创建表模式

pyspark:将多个数据框字段传递给 udf

spark程序里如果给rdd.map传递一个会返回null的函数,最后rdd里面是会少一个元素还是有为null的元素啊

spark sql中需要一次传递多个sql查询

Spark多个动态聚合函数,countDistinct不起作用

使用 Spark 将函数中的多个列名传递给 dplyr::distinct()