当多个 withColumn
函数链接时,火花会通过数据或多个通过数据吗?
例如:
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 -
f1
,f2
,f3
是一些用户定义的功能,或者是cast等列等上的一些火花操作,我甚至可以用foldLeft
链接30个独立的withColumn
功能。
。
重要
我在这里假设f2
不取决于f1
的结果,而f3
不取决于f1
和f2
的结果。这些功能可以按任何顺序执行。任何功能中都没有混乱
我的观察结果
- 所有功能都处于同一阶段
- 新的
withColumn
的添加不会增加执行时间,以怀疑通过数据的其他段落。 - 我已经测试过,例如单个
SQLTransformer
,其中包含所有函数的Select语句与每个功能的多个单独的SQLTransformer
一个函数,并且执行时间相似。
问题
- 对于每个
withColumn
,Spark会通过数据制作一三个段落吗? - 这是否取决于函数的类型
f1
,f2
,f3
?UDF与通用火花操作? - 如果功能
f1
,f2
,f3
在同一阶段,是否意味着它们在同一数据中? - 段落的数量是否取决于功能中的混乱?如果没有洗牌?
- 如果我链
withColumn
函数foldLeft
会更改段落数吗? - 我可以使用三个
SQLTransformers
或仅一个SQLTransformer
进行类似的操作,其中所有三个转换在同一select_statement中。通过数据可以通过的数据有多少? - 基本上没关系,1和3段落的执行时间将相似?
spark会通过数据进行一次或三个段落,每次都会通过数据?
Spark将通过数据"制作一段"。为什么?因为Spark实际上没有做任何到达此代码时,它只是构建执行计划,它可以告诉它在dfnew
被用过时该怎么办(即某些 Action ,例如count
,collect
,write
等)。然后,它将能够一次对每个记录一次计算所有功能。
它取决于函数的类型F1,F2,F3?UDF与通用火花操作?
no。
如果功能F1,F2,F3在同一阶段,是否意味着它们在同一数据中?
是。
段落的数量是否取决于功能中的混乱?如果没有洗牌?
几乎。首先,只要使用 caching / checkpointing ,数据的段落数将是在结果上执行的 actions 的数量newdf
数据框架。然后,每个 shuffle 表示每个记录都是读取的,可能会在工人节点之间发送,可能会写入磁盘,然后再次读取。
如果我用flodleft链接collumn函数会更改段落的数量吗?
否。它只会改变上述计划的构建方式,但它不会影响该计划的外观(将是完全相同的计划),因此计算将保持不变。
我可以使用三个SQLtransFormers或仅在同一Select_statement中所有三个转换的SQLtransFormer进行类似的操作。有多少通过数据的数据?
再次,这不会有任何区别,因为执行计划将保持不变。
基本上没关系,1和3段落的执行时间将相似?
不确定这是什么意思数据和相同的集群设置)。