/ / Pole "element" nie istnieje przy użyciu rurociągu Spark MLlib dla ALS - scala, apache-spark, apache-spark-mllib

Pole "element" nie istnieje przy użyciu rurociągu Spark MLlib dla ALS - scala, apache-spark, apache-spark-mllib

Szkolę system rekomendujący z ALS (wersja Spark: 1.3.1). Teraz chcę użyć a Pipeline do wyboru modelu poprzez weryfikację krzyżową. Na początku próbowałem się dostosować przykładowy kod i wymyśliłem to:

val conf = new SparkConf().setAppName("ALS").setMaster("local")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._

val ratings: RDD[org.apache.spark.mllib.recommendation.Rating] = // ...
val als = new ALS().setMaxIter(10).setRank(10).setRegParam(0.01)
val pipeline = new Pipeline().setStages(Array(als))
val model = pipeline.fit(ratings.toDF)

Kiedy go uruchomię, ostatni wiersz kończy się niepowodzeniem z wyjątkiem:

Exception in thread "main" java.lang.IllegalArgumentException: Field "item" does not exist.
at org.apache.spark.sql.types.StructType$$anonfun$apply$25.apply(dataTypes.scala:1032)
at org.apache.spark.sql.types.StructType$$anonfun$apply$25.apply(dataTypes.scala:1032)
at scala.collection.MapLike$class.getOrElse(MapLike.scala:128)
at scala.collection.AbstractMap.getOrElse(Map.scala:58)
at org.apache.spark.sql.types.StructType.apply(dataTypes.scala:1031)
at org.apache.spark.ml.recommendation.ALSParams$class.validateAndTransformSchema(ALS.scala:148)
at org.apache.spark.ml.recommendation.ALS.validateAndTransformSchema(ALS.scala:229)
at org.apache.spark.ml.recommendation.ALS.transformSchema(ALS.scala:304)
at org.apache.spark.ml.Pipeline$$anonfun$transformSchema$4.apply(Pipeline.scala:142)
at org.apache.spark.ml.Pipeline$$anonfun$transformSchema$4.apply(Pipeline.scala:142)
at scala.collection.IndexedSeqOptimized$class.foldl(IndexedSeqOptimized.scala:51)
at scala.collection.IndexedSeqOptimized$class.foldLeft(IndexedSeqOptimized.scala:60)
at scala.collection.mutable.ArrayOps$ofRef.foldLeft(ArrayOps.scala:108)
at org.apache.spark.ml.Pipeline.transformSchema(Pipeline.scala:142)
at org.apache.spark.ml.PipelineStage.transformSchema(Pipeline.scala:58)
at org.apache.spark.ml.Pipeline.fit(Pipeline.scala:100)
at org.apache.spark.ml.Pipeline.fit(Pipeline.scala:79)
at org.apache.spark.ml.Estimator.fit(Estimator.scala:44)
...

Nie używam napisu "item" w dowolnym miejscu w moim kodzie, więc zakładam, że jest to rodzaj domyślny. Kiedy dodaję .setItemCol("itemId") do als komunikat o wyjątku zmienia się odpowiednio.

Jakie jest znaczenie "item"? Jak mogę sprawić, aby rurociąg działał?

Odpowiedzi:

1 dla odpowiedzi № 1

Okay, rozwiązanie było całkiem proste: użyj org.apache.spark.ml.recommendation.ALS.Rating zamiast org.apache.spark.mllib.recommendation.Rating i to po prostu zadziała.

Inaczej .setItemCol("product") robi lewę, ponieważ org.apache.spark.mllib.recommendation.Rating ma pole o nazwie "produkt", natomiast org.apache.spark.ml.recommendation.ALS.Rating wywołuje odpowiednie pole "element". Musi istnieć jakaś magia, biorąc pod uwagę ciąg znaków, uzyskując dostęp do pola klasy przypadku (refleksji?).