Pyspark提高了多列操作的性能

Pyspark提高了多列操作的性能,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,我编写了一个类,它对分组数据执行标准缩放 class Scaler: . . . . def __transformOne__(self, df_with_stats, newName, colName): return df_with_stats\ .withColumn(newName, (F.col(colName)-F.col(f'avg({colName})'))/(F.col(f'stddev_samp

我编写了一个类,它对分组数据执行标准缩放

class Scaler:
.
.
.
.
def __transformOne__(self, df_with_stats, newName, colName):
    return df_with_stats\
            .withColumn(newName, 
                        (F.col(colName)-F.col(f'avg({colName})'))/(F.col(f'stddev_samp({colName})')+self.tol))\
            .drop(colName)\
            .withColumnRenamed(newName, colName)
    
def transform(self, df):
    df_with_stats = df.join(....) #calculate stats here by doing a groupby and then do a join
    
    return reduce(lambda df_with_stats, kv: self.__transformOne__(df_with_stats, *kv), 
                   self.__tempNames__(), df_with_stats)[df.columns]
这个想法是将均值和方差保存在列中,然后简单地对我想要缩放的列进行列减法/除法。此部分在函数
transformOne
中完成。所以基本上是对一列进行算术运算

如果我想缩放多个列,我只需多次调用函数
transformOne
,但使用
functools.reduce
(请参见函数
transform
),该类对于单个列的运行速度足够快,但当我有多个列时,它会占用太多时间


我不知道spark的内部结构,所以我是一个完全的新手。有什么方法可以改进多列的计算吗?

我的解决方案对
withColumn
函数进行了大量调用。因此,我使用
选择
而不是
withColumn
更改了解决方案。物理层有很大的不同sical计划了这两种方法。对于我的应用程序,我使用
select
,将15分钟改进为2分钟。有关详细信息,请参阅本文