sql >> データベース >  >> NoSQL >> MongoDB

MongoDBデータでMahoutRowSimilarityレコメンダーを実行する

    以下がその答えです:

    import org.apache.hadoop.conf.Configuration
    import org.apache.mahout.math.cf.SimilarityAnalysis
    import org.apache.mahout.math.indexeddataset.Schema
    import org.apache.mahout.sparkbindings
    import org.apache.mahout.sparkbindings.indexeddataset.IndexedDatasetSpark
    import org.apache.spark.rdd.RDD
    import org.bson.BSONObject
    import com.mongodb.hadoop.MongoInputFormat
    
    
    object SparkExample extends App {
      implicit val mc = sparkbindings.mahoutSparkContext(masterUrl = "local", appName = "RowSimilarity")
      val mongoConfig = new Configuration()
      mongoConfig.set("mongo.input.uri", "mongodb://hostname:27017/db.collection")
    
      val documents: RDD[(Object, BSONObject)] = mc.newAPIHadoopRDD(
        mongoConfig,
        classOf[MongoInputFormat],
        classOf[Object],
        classOf[BSONObject]
      )
    
      val documents_Array: RDD[(String, Array[String])] = documents.map(
        doc1 => (
          doc1._2.get("product_id").toString(),
          doc1._2.get("product_attribute_value").toString().replace("[ \"", "").replace("\"]", "").split("\" , \"").map(value => value.toLowerCase.replace(" ", "-").mkString(" "))
        )
      )
    
      val new_doc: RDD[(String, String)] = documents_Array.flatMapValues(x => x)
      val myIDs = IndexedDatasetSpark(new_doc)(mc)
    
      val readWriteSchema = new Schema(
        "rowKeyDelim" -> "\t",
        "columnIdStrengthDelim" -> ":",
        "omitScore" -> false,
        "elementDelim" -> " "
      )
      SimilarityAnalysis.rowSimilarityIDS(myIDs).dfsWrite("hdfs://hadoop:9000/mongo-hadoop-rowsimilarity", readWriteSchema)(mc)
    
    }
    

    build.sbt:

    name := "scala-mongo"
    version := "1.0"
    scalaVersion := "2.10.6"
    libraryDependencies += "org.mongodb" %% "casbah" % "3.1.1"
    libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.1"
    libraryDependencies += "org.mongodb.mongo-hadoop" % "mongo-hadoop-core" % "1.4.2"
    
    libraryDependencies ++= Seq(
      "org.apache.hadoop" % "hadoop-client" % "2.6.0" exclude("javax.servlet", "servlet-api") exclude ("com.sun.jmx", "jmxri") exclude ("com.sun.jdmk", "jmxtools") exclude ("javax.jms", "jms") exclude ("org.slf4j", "slf4j-log4j12") exclude("hsqldb","hsqldb"),
      "org.scalatest" % "scalatest_2.10" % "1.9.2" % "test"
    )
    libraryDependencies += "org.apache.mahout" % "mahout-math-scala_2.10" % "0.11.2"
    libraryDependencies += "org.apache.mahout" % "mahout-spark_2.10" % "0.11.2"
    libraryDependencies += "org.apache.mahout" % "mahout-math" % "0.11.2"
    libraryDependencies += "org.apache.mahout" % "mahout-hdfs" % "0.11.2"
    
    resolvers += "typesafe repo" at " http://repo.typesafe.com/typesafe/releases/"
    resolvers += Resolver.mavenLocal
    

    mongo-hadoop を使用しました Mongoからデータを取得して使用します。データに配列が含まれていたため、flatMapValuesを使用してデータをフラット化し、IDSに渡して適切に出力する必要がありました。

    PS:リンクされた質問ではなく、ここに回答を投稿しました このQ&Aは、データの取得と処理の全範囲をカバーしているためです。




    1. 投稿と共有のためのMongodbスキーマ

    2. ssh経由でMongoDBを同期する

    3. アプリコンテナからredisコンテナに接続できません

    4. Node.js-セッションはres.redirect()を介して持続しません