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分钟。有关详细信息,请参阅本文