org.apache.spark.ml.linalg.DenseVector不是向量模式的有效外部类型

时间:2019-07-02 05:29:17

标签: java apache-spark vector apache-spark-mllib

我已经在Spark中使用Big Data进行了大量工作,现在我有一个小障碍,希望您能在这个小问题上对我有所帮助。

我将Dataset<Row>对象转换为JavaRDD<Row>,因此,我将转换处理为:

//Dataset to RDDs
    JavaRDD<Row> trainingData = featureSelection.javaRDD().map(f -> {
        return RowFactory.create(Double.parseDouble(f.getString(4).trim()),
            Vectors.dense(Double.parseDouble(f.getString(0).trim()), Double.parseDouble(f.getString(1).trim()),
                Double.parseDouble(f.getString(2).trim()), Double.parseDouble(f.getString(3).trim())));
    });

因此,我需要定义一个schema,然后将我的数据再次转换为Dataset<Row>对象。

我的问题是创建架构时:

//Defining schema
    StructType schema = new StructType(new StructField[] {
        new StructField("label", DataTypes.DoubleType, false, Metadata.empty()),
        new StructField("features", new org.apache.spark.mllib.linalg.VectorUDT(), false, Metadata.empty())
    });

但是,然后我得到了这个stack trace

java.lang.RuntimeException: Error while encoding: java.lang.RuntimeException: org.apache.spark.ml.linalg.DenseVector is not a valid external type for schema of vector
validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 0, label), DoubleType) AS label#111
if (assertnotnull(input[0, org.apache.spark.sql.Row, true]).isNullAt) null else newInstance(class org.apache.spark.mllib.linalg.VectorUDT).serialize AS features#112
    at org.apache.spark.sql.catalyst.encoders.ExpressionEncoder.toRow(ExpressionEncoder.scala:290)

因此,似乎我无法使用DenseVectors创建架构。我正在尝试找到正确的VectorStructure来解决我的问题,但是我没有运气。我尚未尝试使用Vectors.sparse,但如果有人解决了此问题,我非常感谢您的帮助。

顺便说一句,我正在使用的Spark版本是2.2.3

非常感谢任何人!

0 个答案:

没有答案