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,newCol3f1
,f2
,f3
是一些用户定义的函数或者像cast这样的列上的一些spark操作。在我的项目中,我甚至可以使用withColumn
链接30个独立的foldLeft
函数。
重要
我在这里假设f2
不依赖于f1
的结果,而f3
不依赖于f1
和f2
的结果。可以按任何顺序执行这些功能。任何功能都没有随机播放
我的观察
- 所有功能都在同一个阶段
- 添加新的
withColumn
不会增加执行时间,从而怀疑通过数据传递额外的段落。 - 我已经测试了单个
SQLTransformer
,其中select语句包含所有函数与多个单独的SQLTransformer
,每个函数的执行时间相似。
问题
- 火花会通过数据进行一到三次传递,每次
withColumn
一次吗? - 它取决于函数的类型
f1
,f2
,f3
? UDF与泛型Spark操作? - 如果函数
f1
,f2
,f3
在同一个阶段,它是否意味着它们在同一个数据传递中? - 段落的数量是否取决于功能内的随机播放?如果没有洗牌?
- 如果我用
withColumn
链接foldLeft
函数会改变段落的数量吗? - 我可以在同一个select_statement中用三个
SQLTransformers
或只有一个SQLTransformer
做同样的事情。通过数据传递了多少? - 基本上没关系,执行的时间与1和3段相似?
火花会通过数据进行一到三次传递,每次传递一次吗?
Spark将通过数据“制作一段”。为什么?因为当达到这个代码时,spark实际上没有做任何事情,它只是建立一个执行计划,告诉它在使用dfnew
时要做什么(即某些动作,例如count
,collect
,write
等)。然后,它将能够为每个记录一次计算所有功能。
它取决于函数f1,f2,f3的类型吗? UDF与泛型Spark操作?
没有。
如果函数f1,f2,f3在同一个阶段内,是否意味着它们在同一个数据传递中?
是。
段落的数量是否取决于功能内的随机播放?如果没有洗牌?
几乎。首先,只要不使用缓存/检查点,数据上的段落数就是在生成的newdf
DataFrame上执行的操作数。然后,每次shuffle意味着读取每个记录,可能在工作节点之间发送,可能写入磁盘,然后再次读取。
如果我用foldLeft链接withColumn函数会改变段落的数量吗?
不会。它只会改变上述计划的构建方式,但它不会影响该计划的外观(将是完全相同的计划),因此计算将保持不变。
我可以在同一个select_statement中使用三个SQLTransformer或只有一个SQLTransformer执行类似的操作。通过数据传递了多少?
同样,这不会有任何区别,因为执行计划将保持不变。
基本上没关系,执行的时间与1和3段相似?
不确定这意味着什么,但这样的声音是不正确的:执行时间主要是洗牌次数和动作次数的一个因素(假设相同的数据和相同的群集设置)。
以上是关于Spark是否会通过数据传递多个withColumn?的主要内容,如果未能解决你的问题,请参考以下文章
spark程序里如果给rdd.map传递一个会返回null的函数,最后rdd里面是会少一个元素还是有为null的元素啊