如何将mongodb与play,spark和scala集成?

时间:2014-12-10 05:18:42

标签: mongodb scala apache-spark

我正在使用play framework 2.2.0并使用salat为play + scala配置了mongo。

我通过在build.sbt中添加以下内容来集成spark以及

 "org.apache.spark" %% "spark-core" % "1.1.0",
"com.typesafe.akka" %% "akka-actor" % "2.2.3",
"com.typesafe.akka" %% "akka-slf4j" % "2.2.3",
"org.mongodb" % "mongo-hadoop-core" % "1.3.0",
"org.apache.spark"  %% "spark-mllib" % "1.1.0"

现在我想写一个代码,它将使用spark和mongo计算数据的线性回归。但我不知道如何从mongo查询mongo。

这是我的简单类,不包含mongo部分。

import com.mongodb.DBObject
import com.mongodb.casbah.Imports._
import com.mongodb.casbah.commons.MongoDBObject
import com.mongodb.casbah.commons.ValidBSONType.BasicDBObject
import com.mongodb.util.JSON
import play.Play
import play.Logger
import play.api.libs.json.{JsValue, Json}

import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala}
import play.Logger
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.hadoop.conf.Configuration


def apply(customerId: String)= {

   val data = List((1416668402352, 10),
      (1415684102290, 20),
      (1415684402210, 30),
      (1415684702188, 15),
      (1415684702780, 25),
      (1415685001845, 40),
      (1415685301846, 100),
      (1415685602110, 35),
      (1415685603483, 50),
      (1416668101756, 29),
      (1415685901549, 95),
      (1415686201903, 18),
      (1415686502076, 24),
      (1415686502765, 90),
      (1415686801514, 32))
    val numIterations = 20
//    val model = LinearRegressionWithSGD.train(list.toArray, numIterations)

    val config = new Configuration()
  }

这里我给出了名为'activity'的mongo集合中的数据。 我想从活动集合中获取数据并计算它的线性回归。

如何从scala + play + spark查询到mongo

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解这个问题,但是为了集成mongo和scala,有一个reactivemongo项目(我们在Play + Scala项目中使用它)

http://reactivemongo.org/

它是非阻塞的,你模仿了mongoDB函数。

  import reactivemongo.api._
  import scala.concurrent.ExecutionContext.Implicits.global

  // gets an instance of the driver
  // (creates an actor system)
  val driver = new MongoDriver
  val connection = driver.connection(List("localhost"))

  // Gets a reference to the database "plugin"
  val db = connection("plugin")

  // Gets a reference to the collection "acoll"
  // By default, you get a BSONCollection.
  val collection = db("acoll")

  val values: Enumerator = collection.find(Json.obj()).cursor.enumerate()

它适用于枚举器,但如果需要,可以将其降级为同步调用,但我不建议

https://www.playframework.com/documentation/2.0/Enumerators

答案 1 :(得分:0)

如果你正在使用游戏而你想要一个ORM工具,你可以试试Salat + salat-play-plugin Play-salat

我正在使用Play 2.4,但它现在是2.5 +,而这个插件是用2.3编写的,你可能需要弄清楚如何使它适用于你的项目。但它适用于2.4,你已经得到了我的承诺。

我不太确定你是否需要通过scala + play + spark查询mongo,如果你的意思是通过spark查询mongo,你可以使用mongo connector来做到这一点,这很简单。如果你的意思是你需要在游戏中通过API调用/查询spark,我之前没有这样做,对不起。