Python 在pyspark数据帧中进行标准缩放会花费太多时间
我尝试了spark.ml中的标准定标器,其功能如下:Python 在pyspark数据帧中进行标准缩放会花费太多时间,python,pandas,apache-spark,bigdata,Python,Pandas,Apache Spark,Bigdata,我尝试了spark.ml中的标准定标器,其功能如下: def standard_scale_2(df, columns_to_scale): """ Args: df : spark dataframe columns_to_scale : list of columns to standard scale """ from pyspark.ml.feature import Standa
def standard_scale_2(df, columns_to_scale):
"""
Args:
df : spark dataframe
columns_to_scale : list of columns to standard scale
"""
from pyspark.ml.feature import StandardScaler
from pyspark.ml import Pipeline
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.functions import vector_to_array
# UDF for converting column type from vector to double type
unlist = udf(lambda x: round(float(list(x)[0]),3), DoubleType())
# Iterating over columns to be scaled
for i in columns_to_scale:
# VectorAssembler Transformation - Converting column to vector type
assembler = VectorAssembler(inputCols=[i],outputCol=i+"_Vect")
# MinMaxScaler Transformation
scaler = StandardScaler(inputCol=i+"_Vect", outputCol=i+"_Scaled")
# Pipeline of VectorAssembler and MinMaxScaler
pipeline = Pipeline(stages=[assembler, scaler])
# Fitting pipeline on dataframe
df = pipeline.fit(df).transform(df).withColumn(i+"_Scaled", unlist(i+"_Scaled")).drop(i+"_Vect",i).withColumnRenamed(i+"_scaled",i)
return df
我没有对每一列进行迭代,而是尝试一次缩放所有列,但也没有成功
我也尝试过使用这个简单的udf进行标准缩放:
for column in columns_to_standard_scale:
sdf = sdf.withColumn(column,
F.col(column) / sdf.agg(stddev_samp(column)).first()[0])
print(column, " completed")
我使用的spark cluster在databricks中具有c5d.2xlarge(16 gb内存8核)节点(最多30个节点)。spark数据帧的大小只有100k。 我需要缩放大约90列。 但每列的缩放时间大约为10分钟,当我尝试一次性缩放所有列时,脚本甚至在2小时后也没有完成。 但是,使用sklearn标准定标器,熊猫中的相同数据帧几乎不需要2分钟 我不认为代码或数据帧有任何问题,但我遗漏了一些造成瓶颈的东西,并且这个简单的操作花费了太多的时间