例如
df.withColumn("customr_num", col("customr_num").cast("integer")).\
withColumn("customr_type", col("customr_type").cast("integer")).\
agg(myMax(sCollect_list("customr_num")).alias("myMaxCustomr_num"), \
myMean(sCollect_list("customr_type")).alias("myMeanCustomr_type"), \
myMean(sCollect_list("customr_num")).alias("myMeancustomr_num"),\
sMin("customr_num").alias("min_customr_num")).show()
.withColumn 和 agg 中的函数列表(sMin,myMax,myMean等)由Spark并行计算还是按顺序计算? >
如果是顺序的,我们如何并行化它们?
答案 0 :(得分:4)
从本质上讲,只要您有多个分区,操作总是在spark中并行化。如果您的意思是,withColumn
操作是否将在数据集上进行一次计算,那么答案也是肯定的。通常,您可以使用Spark UI来了解有关事物计算方式的更多信息。
让我们举一个与您的示例非常相似的示例。
spark.range(1000)
.withColumn("test", 'id cast "double")
.withColumn("test2", 'id + 10)
.agg(sum('id), mean('test2), count('*))
.show
让我们看一下UI。
Range
对应于数据的创建,然后您在每个分区(我们分别为project
(两个withColumn
操作)和聚合(agg
)中进行操作。这里有2个)。在给定的分区中,这些操作是按顺序进行的,但是对于所有分区是同时进行的。而且,它们处于同一阶段(在蓝色框上),这意味着它们都是在数据上一遍计算的。
然后会有一个洗牌(exchange
),这意味着数据是通过网络交换的(每个分区的聚合结果),并执行最终的聚合(HashAggregate
),然后发送到驱动程序(collect
)