Чтобы получить неявные предпочтения определенного набора данных, использовали модель ALS, я передал значения, которые выглядят следующим образом:
ALS als = new ALS().setRank(5)
.setMaxIter(10)
.setRegParam(0.01)
.setImplicitPrefs(true)
.setUserCol("UserId")
.setItemCol("SongId")
.setRatingCol("SongFrequency");
ALSModel model = als.fit(indexedSongData);
Но когда я передаю значение model.userFactors()
в VectorAssembler
, я получаю сообщение об ошибке.
VectorAssembler assembler = new VectorAssembler()
.setInputCols(clusterIn.columns())
.setOutputCol("newfeatures");
Dataset<Row> finalData = assembler.transform(clusterIn);
finalData.show();
Мне нужна помощь, чтобы понять, как извлечь только значения FloatType
и перейти к VectorAssembler
в Java Spark, чтобы избежать этой ошибки.
Exception in thread "main" java.lang.IllegalArgumentException:
Data type ArrayType(FloatType,false) of column features is not supported.
at org.apache.spark.ml.feature.VectorAssembler.transformSchema
(VectorAssembler.scala:124)
at org.apache.spark.ml.PipelineStage.transformSchema(Pipeline.scala:74)
at org.apache.spark.ml.feature.VectorAssembler.transform(VectorAssembler.scala:54)
at com.vinodh.SparkMLAnalytics.SaavnAnalyticsCTR.main(SaavnAnalyticsCTR.java:157)
Вывод model.userFactors () выглядит следующим образом после использования ALS
Схема:
root
|-- id: integer (nullable = false)
|-- features: array (nullable = true)
| |-- element: float (containsNull = false)
+---+--------------------+
| id| features|
+---+--------------------+
| 0|[-11.14011, 11.50...|
| 10|[-2.666257E-4, -2...|
| 20|[-11.254366, 7.79...|
| 30|[-9.674937, 9.451...|
| 40|[-19.472946, -9.4...|
| 50|[-0.95482934, -1....|
| 60|[-13.895673, 3.53...|
| 70|[-1.5750946, 3.51...|
| 80|[-4.980055, 16.52...|
| 90|[-8.297111, -4.50...|
|100|[-2.684091, 4.028...|
|110|[2.495883E-5, -3....|
|120|[-0.01376735, 0.0...|
|130|[-10.3604145, 9.1...|
|140|[-8.58998, 13.356...|
|150|[-4.0318933, 1.93...|
|160|[-14.4151, -0.346...|
|170|[-10.540031, 1.60...|
|180|[-6.2203665, -11....|
|190|[-16.832596, -4.7...|
+---+--------------------+
показаны только 20 верхних строк
spark.udf().register("toVector", toVector, new VectorUDT());
Dataset <Row> clusterIn =
model.userFactors().withColumn("newfeatures",
callUDF("toVector",model.userFactors().col("features")));
Если я использую приведенный выше код, я могу передать его в VectorAssembler, но существует столбец объектов, который выдает сообщение о том, что столбец «Функции» уже существует.
вывод с другим столбцом "newfeatures"
+---+--------------------+--------------------+
| id| features| newfeatures|
+---+--------------------+--------------------+
| 0|[-11.14011, 11.50...|[-11.140110015869...|
| 10|[-2.666257E-4, -2...|[-2.6662569143809...|
| 20|[-11.254366, 7.79...|[-11.254365921020...|
| 30|[-9.674937, 9.451...|[-9.6749372482299...|
| 40|[-19.472946, -9.4...|[-19.472946166992...|
| 50|[-0.95482934, -1....|[-0.9548293352127...|
| 60|[-13.895673, 3.53...|[-13.895672798156...|
| 70|[-1.5750946, 3.51...|[-1.5750945806503...|
| 80|[-4.980055, 16.52...|[-4.9800548553466...|
| 90|[-8.297111, -4.50...|[-8.2971105575561...|
|100|[-2.684091, 4.028...|[-2.6840910911560...|
|110|[2.495883E-5, -3....|[2.49588301812764...|
|120|[-0.01376735, 0.0...|[-0.0137673504650...|
|130|[-10.3604145, 9.1...|[-10.360414505004...|
|140|[-8.58998, 13.356...|[-8.5899801254272...|
|150|[-4.0318933, 1.93...|[-4.0318932533264...|
|160|[-14.4151, -0.346...|[-14.415100097656...|
|170|[-10.540031, 1.60...|[-10.540031433105...|
|180|[-6.2203665, -11....|[-6.2203664779663...|
|190|[-16.832596, -4.7...|[-16.832595825195...|
+---+--------------------+--------------------+