将Spark连接到多个Mongo集合

时间:2017-03-28 06:16:39

标签: mongodb apache-spark

我有以下MongoDB集合:employeedetails

现在我有一个要求,我必须从两个集合中获取文档到spark来分析数据。

我尝试了下面的代码,但它似乎无法正常工作

SparkConf conf = new SparkConf().setAppName("DBConnection").setMaster("local[*]")
                .set("spark.app.id","MongoSparkExample")
                .set("spark.mongodb.input.uri","mongodb://localhost/Emp.employee")
                .set("spark.executor.memory", "6g");

SparkSession session = SparkSession.builder().appName("Member Log")
                .config(conf).getOrCreate();

SparkConf dailyconf = new SparkConf().setAppName("DBConnection").setMaster("local[*]")
                .set("spark.app.id","Mongo Two Example")
                .set("spark.mongodb.input.uri","mongodb://localhost/Emp.details");

SparkSession mongosession = SparkSession.builder().appName("Daily Log")
                .config(dailyconf).getOrCreate();

任何指针都会受到高度赞赏。

4 个答案:

答案 0 :(得分:2)

首先,就像eliasah所说,你应该只创建一个Spark Session。 其次,看看官方MongoDB Spark Connector。它提供了MongoDB和Apache Spark之间的集成。它使您可以在Dataframes中加载集合。

请参阅官方文档:

修改

文档说明如下:

  

使用ReadConfig对象调用loadFromMongoDB()以指定不同的MongoDB服务器地址,数据库和集合。

在你的情况下:

sc.loadFromMongoDB(ReadConfig(Map("uri" -> "mongodb://localhost/Emp.details"))) 

答案 1 :(得分:2)

我通过添加以下代码来修复此问题

onclick

答案 2 :(得分:0)

您可以使用最新的Spark SQL功能。通过按要求传递参数:

sparksession = SparkSession
      .builder()
      .master("local[*]")
      .appName("TEST")
      .config( "spark.mongodb.input.uri", mongodb://localhost:portNo/dbInputName.CollInputName")
      .config "spark.mongodb.output.uri", "mongodb://localhost:portNo/dbOutName.CollOutName")
      .getOrCreate()

val readConfigVal = ReadConfig(Map("uri" -> uriName,"database" -> dbName, "collection" -> collName, "readPreference.name" -> "secondaryPreferred"), Some(ReadConfig(sparksession)))

var mongoLoadedDF = MongoSpark.load(sparksession,readConfig)

println("mongoLoadedDF:"+mongoLoadedDF.show())

答案 3 :(得分:0)

您可以使用readOverrides / writeOverrides读写多个表。

        SparkSession spark = SparkSession
                .builder()
                .appName("Mongo connect")
                .config("spark.mongodb.input.uri", "mongodb://user:password@ip_addr:27017/database_name.employee")
                .getOrCreate();

        JavaSparkContext jsc = new JavaSparkContext(spark.sparkContext());

        // Read employee table 1
        JavaMongoRDD<Document> employeeRdd = MongoSpark.load(jsc);

        Map<String, String> readOverrides = new HashMap<String, String>();

        // readOverrides.put("database", "database_name");
        readOverrides.put("collection", "details");
        ReadConfig readConfig = ReadConfig.create(jsc).withOptions(readOverrides);

        // Read another table 2 (details table )
        JavaMongoRDD<Document> detailsRdd = MongoSpark.load(jsc, readConfig);


        System.out.println(employeeRdd.first().toJson());
        System.out.println(detailsRdd.first().toJson());

        jsc.close();