Тип данных ArrayType (FloatType, false) не поддерживается при передаче в VectorAssembler из UserFactors () совместной фильтрации ALS - PullRequest
0 голосов
/ 06 ноября 2018

Чтобы получить неявные предпочтения определенного набора данных, использовали модель 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...|
+---+--------------------+--------------------+
...