使用sparksql在mongodb中加载JSON数据

时间:2016-02-22 12:37:46

标签: json mongodb scala apache-spark apache-spark-sql

我有一个JSON文件,我想使用Spark SQL将其加载到MongoDB中。我有办法将单个元素加载到如下所示的集合中

val mongoClient = MongoClient(127.0.0.1, 27017)
val collection = mongoClient(dbname)(collection_name)
for (a <- 1 to 10) {
  collection.insert {
    MongoDBObject("id" -> a.toString,
      "age" -> (10 + a),
      "description" -> s"description $a",
      "enrolled" -> (a % 2 == 0),
      "name" -> s"Name $a")
  }

由于MongoDB已经以JSON格式存储数据,有没有办法直接加载我的JSON文件?

1 个答案:

答案 0 :(得分:0)

当然,MongoDB的底层数据格式是 BSON ,但请记住我们可以使用mongoexport以json格式导出MongoDB文档。也许这与你的情况无关,我的观点是我们实际上可以用SparkSQL加载json文件,以下是我尝试完成它的方法。

我们需要的一个重要图书馆是Spark library for easy MongoDB access

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SQLContext
import com.stratio.datasource.mongodb._
import com.stratio.datasource.mongodb.MongodbConfig._

object DFToMongoDB extends App {

  lazy val sc = new SparkContext(new SparkConf()
    .setAppName("mongodb")
    .setMaster("local[4]"))

  val sqlContext = new SQLContext(sc)

  /*
    sample data in xxx.json  

    {
      "_id":"xxxx","workHome":false,"commute":true,
      "tel":false,"weekend":true,"age":100.0
    }
  */
  val dataFrame = sqlContext.read.json("xxx.json")

  def forCollection(collectionName: String) = {
    MongodbConfigBuilder(
      Map(
        Host -> List("127.0.0.1"), Database -> "xxx", 
        Collection -> collectionName,
        SamplingRatio -> 1.0, 
        WriteConcern -> com.mongodb.casbah.WriteConcern.Acknowledged,
        SplitSize -> 8, SplitKey -> "_id"
      )
    ).build
  }

  // dataFrame will be converted to MongodbDataFrame here 
  dataFrame.saveToMongodb(forCollection("xxx"))
}

此外,我尝试的情况是在加载之前MongoDB中不存在该集合,之后MongoDB将在json文件中创建包含记录的集合。至于其他情况,你可以试试。

无论如何,希望它有所帮助。