在pyspark中并行计算.withColumn和.agg吗?

时间:2019-03-22 16:20:17

标签: python apache-spark pyspark apache-spark-sql

例如

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并行计算还是按顺序计算? >

如果是顺序的,我们如何并行化它们?

1 个答案:

答案 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。

enter image description here

Range对应于数据的创建,然后您在每个分区(我们分别为project(两个withColumn操作)和聚合(agg)中进行操作。这里有2个)。在给定的分区中,这些操作是按顺序进行的,但是对于所有分区是同时进行的。而且,它们处于同一阶段(在蓝色框上),这意味着它们都是在数据上一遍计算的。

然后会有一个洗牌(exchange),这意味着数据是通过网络交换的(每个分区的聚合结果),并执行最终的聚合(HashAggregate),然后发送到驱动程序(collect