如何在不使用StandardScaler的情况下标准化PySpark中的列?

如何在不使用StandardScaler的情况下标准化PySpark中的列?,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,看起来这应该行得通,但我有错误: mu=平均值DF[输入] sigma=stddevdf[输入] dft=df.withColumnoutput,df[输入]-mu/sigma pyspark.sql.utils.AnalysisException:分组表达式序列为 空,并且''user`'不是聚合函数。包 '将'sumresponse'转换为双平均'sumresponse''/ stddev_sampCAST`sumsresponse`与中的`scaled`'相同 窗口函数或在第一个或第一个值

看起来这应该行得通,但我有错误:

mu=平均值DF[输入] sigma=stddevdf[输入] dft=df.withColumnoutput,df[输入]-mu/sigma pyspark.sql.utils.AnalysisException:分组表达式序列为 空,并且''user`'不是聚合函数。包 '将'sumresponse'转换为双平均'sumresponse''/ stddev_sampCAST`sumsresponse`与中的`scaled`'相同 窗口函数或在第一个或第一个值中换行''user`',如果 你不在乎你得到了什么价值\nAggregate[user0, SUMBRESPONSE26L,CASTSUMBRESPONSE26L为双精度- avgsumresponse26L/STDEV_SAMPCASTSUMSRESPONSE26L as 双倍于scaled46]\n+-AnalysisBarrier\n+-Aggregate [user0],[user0,sumcasterresponse3作为bigint作为 sumresponse26L]\n+-中的过滤器项_id1 129130131132133134135136137138\n+- 关系[user0,item_id1,response_value2,response3,trait4,response_timestamp5] csv\n 我不确定此错误消息是怎么回事。

幸运的是,我能够找到有效的代码:

summary=df.select[meaninput.alias'mu',stddevinput.alias'sigma']\ .收集 dft=df.withColumnoutput,df[输入]-summary.mu/summary.sigma 一般来说,使用collect不是一个好的解决方案,您会发现它不会随着数据的增长而扩展

如果您不想使用StandardScaler,更好的方法是使用窗口来计算平均值和标准偏差

借用相同的例子:

从pyspark.sql.functions导入col、mean、stddev 从pyspark.sql导入窗口 df=spark.createDataFrame np.ArrayRange 1,10,1.Reforme3,3.tolist, [int1、int2、int3] df.show +--+--+--+ |int1 | int2 | int3| +--+--+--+ | 1| 2| 3| | 4| 5| 6| | 7| 8| 9| +--+--+--+ 假设您想要标准化列int2:

输入值=int2 输出列=整数2 w=Window.partitionBy mu=平均输入值 西格玛=标准输入值 df.with column output\u col,colinput\u col-mu/sigma.show +--+--+--+------+ |int1 | int2 | int3 | int2|U标度| +--+--+--+------+ | 1| 2| 3| -1.0| | 7| 8| 9| 1.0| | 4| 5| 6| 0.0| +--+--+--+------+
如果您想像在另一个示例中一样使用总体标准偏差,请将pyspark.sql.functions.stddev替换为pyspark.sql.functions.stddev_pop.

这只适用于向量。@pault请随意提供您认为更好的答案。回答得好!谢谢