列要素必须是org.apache.spark.ml.linalg.VectorUDT类型

S.L*_*tfi 5 import apache-spark pyspark

我想在pyspark(spark 2.1.1)中运行此代码:

from pyspark.ml.feature import PCA

bankPCA = PCA(k=3, inputCol="features", outputCol="pcaFeatures") 
pcaModel = bankPCA.fit(bankDf)    
pcaResult = pcaModel.transform(bankDF).select("label", "pcaFeatures")    
pcaResult.show(truncate= false)
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

要求失败:列要素必须是类型 org.apache.spark.ml.linalg.Vect orUDT@3bfc3ba7 但实际上是 org.apache.spark.mllib.linalg.VectorUDT@f71b0bce.

tit*_*o89 3

您可以在这里找到示例:

from pyspark.ml.feature import PCA
from pyspark.ml.linalg import Vectors

data = [(Vectors.sparse(5, [(1, 1.0), (3, 7.0)]),),
    (Vectors.dense([2.0, 0.0, 3.0, 4.0, 5.0]),),
    (Vectors.dense([4.0, 0.0, 0.0, 6.0, 7.0]),)]
df = spark.createDataFrame(data, ["features"])

pca = PCA(k=3, inputCol="features", outputCol="pcaFeatures")
model = pca.fit(df)

... other code ...
Run Code Online (Sandbox Code Playgroud)

正如您在上面看到的,df是一个数据帧,其中包含从 pyspark.ml.linalg导入的 Vectors.sparse() 和 Vectors.dense() 。

也许,您的bankDf包含从 pyspark.mllib.linalg导入的向量。

因此,您必须设置导入数据框中的向量

from pyspark.ml.linalg import Vectors 
Run Code Online (Sandbox Code Playgroud)

代替:

from pyspark.mllib.linalg import Vectors
Run Code Online (Sandbox Code Playgroud)

也许你会发现这个stackoverflow 问题很有趣。