通过带有查询的Apache Spark通过MongoDB读取数据

时间:2019-02-15 11:40:20

标签: mongodb scala apache-spark

我能够通过Apache Spark通过其文档中介绍的常规方法读取MongoDB中存储的数据。我有一个mongoDB查询,我想在加载集合时使用它。查询很简单,但是我似乎找不到正确的方法来指定SparkSession对象中的config()函数查询。

以下是我的SparkSession构建器

val confMap: Map[String, String] = Map(
      "spark.mongodb.input.uri" -> "mongodb://xxx:xxx@mongodb1:27017,mongodb2:27017,mongodb3:27017/?ssl=true&replicaSet=MongoShard-0&authSource=xxx&retryWrites=true&authMechanism=SCRAM-SHA-1",
      "spark.mongodb.input.database" -> "A",
      "spark.mongodb.input.collection" -> "people",
      "spark.mongodb.output.database" -> "B",
      "spark.mongodb.output.collection" -> "result",
      "spark.mongodb.input.readPreference.name" -> "primaryPreferred"
    )
    conf.setAll(confMap)
    val spark: SparkSession =
      SparkSession.builder().master("local[1]").config(conf).getOrCreate()

是否可以在SparkConf对象中指定MongoDB查询,以便SparkSession仅读取集合中存在的特定字段。

1 个答案:

答案 0 :(得分:1)

使用.withPipeline API

示例代码:

val readConfig = ReadConfig(Map("uri" -> MONGO_DEV_URI, "collection" -> MONGO_COLLECTION_NAME, "readPreference.name" -> "secondaryPreferred"))

    MongoSpark
    .load(spark.sparkContext, readConfig)
    .withPipeline(Seq(Document.parse(query)))

根据评论:

sparkSession.read.format("com.mongodb.spark.sql.DefaultSource")
.option("pipeline", "[{ $match: { name: { $exists: true } } }]")
.option("uri","mongodb://127.0.0.1/mydb.mycoll")
.load()