Я много работал с Big Data в Spark, и у меня сейчас есть небольшой блокировщик, надеюсь, вы поможете мне с этой маленькой проблемой.
Я преобразую 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
.
Большое спасибо всем !!