如何修复:pyspark.sql.utils.IllegalArgumentException:列功能的类型错误?

时间:2019-03-31 06:47:23

标签: pyspark pyspark-sql

我是pyspark的新手,正在尝试在简单的代码下运行。

# create a RDD of LabeledPoint
bcData = MLUtils.loadLibSVMFile(sc, "breast-cancer.txt")

# convert it to DataFrame
bcDataFrame = ss.createDataFrame(bcData)
bcDataFrame.cache()

# split the data
(training_data, testing_data) = bcDataFrame.randomSplit([0.8, 0.2])

# create the model
dt_classifier = DecisionTreeClassifier(impurity="gini", maxDepth=2, labelCol="label", featuresCol="features")
dt_model = dt_classifier.fit(training_data)

运行时,在最后一行出现以下错误。

  

pyspark.sql.utils.IllegalArgumentException:u'requirement失败:列特征必须为struct <类型:tinyint,size:int,indices:array ,values:array >,但实际上是struct ,values:array >。'

我不确定当“功能”列的实际类型与预期的确切匹配时为什么会出现此错误。

2 个答案:

答案 0 :(得分:0)

我猜想根本原因是您可能同时导入ml和mllib。如果导入Vectors,SparseVector和VectorUDT,我曾经有过类似的消息。有些是从ml导入的,有些是从mllib导入的。仅从ml导入它们之后,此错误消息就消失了。

答案 1 :(得分:0)

在以下环境中工作时,我遇到了同样的问题: Databrick,Spark 2.4.0,Scala 2.11

就我而言,错误是导入错误的程序包。错误的时候我有:

import org.apache.spark.ml.feature.PCA
import org.apache.spark.mllib.linalg.Vectors

错误是第二次导入(使用错误的Vectors类)。解决方案是将第二次导入更改为:

import org.apache.spark.ml.linalg.Vectors

瞧!

希望这会为您提供一些在python中修复它的线索。