【问题标题】:IllegalArgumentException when computing a PCA with Spark ML使用 Spark ML 计算 PCA 时出现 IllegalArgumentException
【发布时间】:2020-01-27 17:48:09
【问题描述】:

我有一个包含 idfeatures 列的 parquet 文件,我想应用 pca 算法。

val dataset =  spark.read.parquet("/usr/local/spark/dataset/data/user")
val features = new VectorAssembler()
    .setInputCols(Array("id", "features" ))
    .setOutputCol("features")
val pca = new PCA()
     .setInputCol("features")
     .setK(50)
     .fit(dataset)
     .setOutputCol("pcaFeatures")
val result = pca.transform(dataset).select("pcaFeatures")
pca.save("/usr/local/spark/dataset/out")

但我有这个例外

java.lang.IllegalArgumentException:要求失败:列特征必须是 org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 类型,但实际上是 ArrayType(DoubleType,true)。

【问题讨论】:

  • 你能告诉我们dataset.printSchema的结果吗?

标签: scala apache-spark


【解决方案1】:

Spark 的 PCA 转换器需要由 VectorAssembler 创建的列。在这里,您创建一个但从不使用它。此外,VectorAssembler 仅将数字作为输入。我不知道features 的类型是什么,但是如果是数组,那就不行了。首先将其转换为数字列。最后,以与原始列相同的方式命名组装列是一个坏主意。实际上,VectorAssembler 不会删除输入列,如果有两个 features 列,您最终会得到。

这是 Spark 中 PCA 计算的一个工作示例:

import org.apache.spark.ml.feature._

val df = spark.range(10)
    .select('id, ('id * 'id) as "id2", ('id * 'id * 'id) as "id3")
val assembler = new VectorAssembler()
    .setInputCols(Array("id", "id2", "id3")).setOutputCol("features")
val assembled_df = assembler.transform(df)
val pca = new PCA()
    .setInputCol("features").setOutputCol("pcaFeatures").setK(2)
    .fit(assembled_df)
val result = pca.transform(assembled_df)

【讨论】:

    猜你喜欢
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    相关资源
    最近更新 更多