【发布时间】:2019-12-11 14:06:21
【问题描述】:
我有一个数据框(df_ml_nullable),像这样:
+-----+--------------------+
|label| features|
+-----+--------------------+
| 0.0|[127.0,132.0,123....|
| 0.0|[67.0,67.0,67.0,6...|
| 0.0|[-29.0,-30.0,-28....|
| 4.0|[31.0,31.0,31.0,3...|
| 0.0|[39.0,40.0,42.0,4...|
+-----+--------------------+
以下是此数据框的架构: df_ml_nullable.printSchema()
root
|-- label: double (nullable = false)
|-- features: vector (nullable = false)
我尝试像这样运行逻辑回归:
from pyspark.ml.linalg import Vectors
from pyspark.ml.classification import LogisticRegression
lr = LogisticRegression(maxIter=10, regParam=0.01)
(train_d,test_d)=df_ml_nullable.randomSplit([0.7, 0.3])
model1 = lr.fit(train_d)
当我尝试运行它时,我得到了这个错误: IllegalArgumentException: u'requirement failed: Column features must be of type struct,values:array> 但实际上是 struct,values:array>。'
有人遇到过这个问题吗?
【问题讨论】:
-
您应该检查您使用的矢量类型。根据您的 Spark 版本,spark.mllibs 和 spark.ml 之间可能存在冲突,如果您将一个包的回归与另一个包的向量类型一起使用,则会出现此错误。
-
@Vincent 非常感谢您的回复。特征列最初是一个双精度数组(collect_list 操作的输出)。我使用下面的 udf 将其转换为向量:
def fn(row): ln = len(row) idx = range(ln) sp_vc = Vectors.sparse(ln,idx,row) return(Vectors.dense(row)) #return(sp_vc) usr_fn = F.udf(fn,VectorUDT()) df_indexed_vct = df_indexed.withColumn("features",usr_fn(F.col('pump_sequence')))那么在 udf 的返回类型中我应该使用不同的向量类型吗?一个愚蠢的问题 - 如何在我的环境中检查 spark.ml 和 spark.mlib 的版本?
标签: apache-spark apache-spark-mllib pyspark-dataframes