随笔 - 836  文章 - 1 评论 - 40 阅读 - 102万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

参考链接

场景:适用于数据清洗,如只需要部分字段:

 

依赖:

复制代码
    <dependency>
        <groupId>org.mongodb.spark</groupId>
        <artifactId>mongo-spark-connector_2.11</artifactId>
        <version>2.0.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.0.2</version>
    </dependency>
复制代码

 

 

代码:

复制代码
package com.edurt.ssi
import com.mongodb.spark._
import org.apache.spark.{SparkConf, SparkContext}
import org.bson._
object MongoSparkTest {

  def main(args: Array[String]): Unit =
  {


    val conf = new SparkConf()
      .setMaster("local[4]")
      .setAppName("Mingdao-Score")
      .set("spark.mongodb.input.uri", "mongodb://192.168.18.129:27017/swift.booking")
      .set("spark.mongodb.output.uri", "mongodb://192.168.18.129:27017/outputDB.collectionName")
//    import com.mongodb.spark.config._
//    val readConfig = ReadConfig(Map("collection" -> "employee", "readPreference.name" -> "secondaryPreferred"), Some(ReadConfig(sc)))
    //同时还支持mongo驱动的readPreference配置, 可以只从secondary读取数据
    //      .set("spark.mongodb.input.uri", "mongodb://xxx.xxx.xxx.xxx:27017,xxx.xxx.xxx:27017,xxx.xxx.xxx:27017/inputDB.collectionName")
    //      .set("spark.mongodb.output.uri", "mongodb://xxx.xxx.xxx.xxx:27017,xxx.xxx.xxx:27017,xxx.xxx.xxx:27017/outputDB.collectionName")

    val sc = new SparkContext(conf)
    // 创建rdd
    //    val customRdd = MongoSpark.load(sc, readConfig)
    val originRDD = MongoSpark.load(sc)

    // 构造查询
    //    val dateQuery = new BsonDocument()
    //      .append("$gte", new BsonDateTime(start.getTime))
    //      .append("$lt", new BsonDateTime(end.getTime))
    val matchQuery = new Document("$match", BsonDocument.parse("{\"businessType\":\"B2B\"}"))

    // 构造Projection
    val projection1 = new BsonDocument("$project", BsonDocument.parse("{\"businessType\":\"$businessType\",\"bookingNo\":\"$bookingNo\",\"status\":\"$status\"}"))
    val aggregatedRDD = originRDD.withPipeline(Seq(matchQuery, projection1))

    //比如分组
    val rdd1 = aggregatedRDD.keyBy(x=>{
      Map(
        "businessType" -> x.get("businessType")
      )
    })

    //    val rdd2 = rdd1.groupByKey.map(t=>{
    //      (t._1, t._2.map(x => {
    //        x.getString("message").length
    //      }).sum)
    //    })

    rdd1.collect().foreach(x=>{
      println(x)
    })

    //保持统计结果至MongoDB outputurl 所指定的数据库
    MongoSpark.save(aggregatedRDD)


  }

}
复制代码

 

posted on   lshan  阅读(839)  评论(2编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示