/ /フィールド“ item”はALS用のSpark MLlibパイプラインを使用して存在しません - scala、apache-spark、apache-spark-mllib

フィールド "item"はALSのSpark MLlibパイプラインを使用していません - scala、apache-spark、apache-spark-mllib

私はALS(Spark version:1.3.1)で推薦システムを訓練しています。今私は使いたい Pipeline 交差検定によるモデル選択用。最初のステップとして、私は適応しようとしました サンプルコード そしてこれを思い付いた:

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)

実行すると、最後の行が例外で失敗します。

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)
...

文字列は使いません "item" 私のコードのどこにでもあるので、私はそれがある種のデフォルトであると思います。追加したとき .setItemCol("itemId")als それに応じて例外メッセージが変わります。

何の意味ですか? "item"?パイプラインを機能させるにはどうすればよいですか。

回答:

回答№1は1

さて、解決策は実際には非常に単純でした。 org.apache.spark.ml.recommendation.ALS.Rating の代わりに org.apache.spark.mllib.recommendation.Rating そしてそれはうまくいくでしょう。

さもないと .setItemCol("product") トリックをします org.apache.spark.mllib.recommendation.Rating "product"というフィールドがあります。 org.apache.spark.ml.recommendation.ALS.Rating 対応する項目 "item"を呼び出します。文字列が与えられると、ケースクラスのいくつかのフィールドにアクセスするということで、それには何らかの魔法が必要です(リフレクション?)。