Spark 将数据帧列转换为 StandardScaler() 的密集向量 "Column must be of type org.apache.spark.ml.linalg.VectorUDT"

Spark Convert Data Frame Column to dense Vector for StandardScaler() "Column must be of type org.apache.spark.ml.linalg.VectorUDT"

我是 Spark 的新手,我正在尝试将 StandardScaler() 应用于 DataFrame 中的列。

+---------------+
|      DF_column|
+---------------+
| 0.114285714286|
| 0.115702479339|
| 0.267893660532|
|0.0730337078652|
| 0.124309392265|
| 0.365714285714|
| 0.111747851003|
| 0.279538904899|
| 0.134670487106|
| 0.523287671233|
| 0.404011461318|
|          0.375|
| 0.125517241379|
|0.0143266475645|
| 0.313684210526|
| 0.381088825215|
| 0.411428571429|
| 0.327683615819|
| 0.153409090909|
| 0.344827586207|
+---------------+

问题是像这样应用它,给我一个错误:

requirement failed: Input column DF_column must be a vector column.

我试过使用 UDF,但还是不行。

scaler = StandardScaler(inputCol='DF_column', 
    outputCol="scaledFeatures",withStd=True, withMean=False)

我做了 LIBSVM 的示例,但是 TXT 文件将特征加载为向量很容易。

如果您有一列标量,那么 StandardScaler 就太过分了。可以直接缩放:

from pyspark.sql.functions import col, stddev_samp

df.withColumn("scaled",
  col("DF_column") / df.agg(stddev_samp("DF_column")).first()[0])

但是如果你真的想使用缩放器而不是 assemble 首先使用矢量:

from pyspark.ml.feature import VectorAssembler
from pyspark.ml.feature import StandardScaler

assembler = VectorAssembler(
  inputCols=["DF_column"], outputCol="features"
)

assembled = assembler.transform(df)

scaler = StandardScaler(
  inputCol="features", outputCol="scaledFeatures",
  withStd=True, withMean=False
).fit(assembled)

scaler.transform(assembled)