我已经在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
。
非常感谢任何人!