美文网首页
spark-mongodb简单上手

spark-mongodb简单上手

作者: Josen_Qu | 来源:发表于2018-06-15 14:02 被阅读45次

Spark提供的所有计算,不管是批处理,Spark SQL,Spark Streaming还是Spark ML,它们底层都是通过RDD计算。所以这里就以RDD方式简单上手。首先认识一下RDD:RDD(Resilient Distributed Dataset)是Spark最基础核心的概念,它表示可分区,不可变的并能够被并行操作的数据集合,不同的数据集格式对应不同的RDD实现。RDD可以缓存到内存或磁盘中,每次对RDD数据集的操作之后的结果可以复用,省去了MapReduce大量的磁盘IO操作。这对于迭代运算频繁的不同维度的批处理、机器学习算法、交互式数据挖掘来说,效率提高很多。
方便起见,这里Spark使用的本地单机模式,需要在本地安装Spark及配置环境变量,由于Spark是Scala写的,也要安装Scala及环境变量的配置,注意对应的Scala版本要匹配。代码使用Maven构建工程。项目中,数据库使用Mongdb,编程语言Java,业务意义就是统计今年申报出口业务中每家企业的报关单量。

pom文件部分:

  <dependency>

  <groupId>org.apache.spark</groupId>

  <artifactId>spark-core_2.11</artifactId>

  <version>2.2.0</version>

  </dependency>

  <dependency>

  <groupId>org.mongodb.spark</groupId>

  <artifactId><u>mongo</u>-spark-connector_2.11</artifactId>

  <version>2.2.1</version>

  </dependency>

  <dependency>

  <groupId>org.apache.spark</groupId>

  <artifactId>spark-sql_2.11</artifactId>

  <version>2.2.0</version>

  </dependency>

代码部分:

        // 创建 一个 spark session,可以配置输入源,输出源,spark运行模式,spark应用实例名称等
        SparkSession spark = SparkSession.builder().master("local").appName("MongodbSparkDemoTest")
                .config("spark.mongodb.input.uri",
                        "mongodb://user:password@localhost:port/db.collection")
                .config("spark.mongodb.output.uri",
                        "mongodb://user:password@localhost:port/db.collection2")
                .getOrCreate();

        // 创建一个javaspark 上下文
        JavaSparkContext jsc = new JavaSparkContext(spark.sparkContext());
        // 使用mongodb 聚合管道获取数据 生成一个RDD
        JavaMongoRDD<Document> aggregatedRdd = MongoSpark.load(jsc).withPipeline(Collections.singletonList(Aggregates
                .match(Filters.and(Filters.eq("iEMark", "E"), Filters.gte("declareDate", "20180101000000")))));
        // 原始数据的样子
        System.out.println("原始数据的样子");
        aggregatedRdd.take(5).forEach((t) -> {
            System.out.println(t);
        });
        ;
        // map 将一条记录映射成 key - value 的形式,key,value都可以是多个字段
        JavaPairRDD<String, Long> mapRdd = aggregatedRdd.mapPartitionsToPair((Iterator<Document> t) -> {
            List<Tuple2<String, Long>> list = new ArrayList<>();
            while (t.hasNext()) {
                Document doc = t.next();
                list.add(new Tuple2<String, Long>(doc.getString("tradeCode"), (long) 1));
            }
            return list.iterator();
        });
        // map后的样子
        System.out.println("map后的样子");
        mapRdd.take(5).forEach((t) -> {
            System.out.println(t);
        });
        // reduce 将相同key的value聚合
        JavaPairRDD<String, Long> reducedRdd = mapRdd.reduceByKey((Long v1, Long v2) -> {
            return v1 + v2;
        });
        // reduce 后的样子
        System.out.println("reduce后的样子,企业编码-报关单量");
        reducedRdd.take(5).forEach((t) -> {
            System.out.println(t);
        });
        // 转换成mongodb文档格式
        JavaRDD<Document> reducedDocRdd = reducedRdd.map((Tuple2<String, Long> v1) -> {
            return new Document().append("tradeCode", v1._1).append("entryQty", v1._2);
        });
        // 统计结果保存到mongodb
        MongoSpark.save(reducedDocRdd);

        jsc.close();

Console输出:


图片.png

相关文章

  • spark-mongodb简单上手

    Spark提供的所有计算,不管是批处理,Spark SQL,Spark Streaming还是Spark ML,它...

  • 线上答题员招募啦,名额有限,赶紧上车

    简单易上手

  • matplotlib 简单上手

    本文总结自途索的慕课网课程,增加了些自己的理解。 matplotlib 是一个优秀的数据可视化库,可以很方便的使用...

  • 简单易上手

    迟做总比不做好。 Better late than never. 算了。 Never mind. 凡事别说那么绝对...

  • Mybatis简单上手

    一、搭建MySQL环境 创建maven项目 导入maven依赖 配置xml和properties文件的扫描方式 完...

  • Tiles 简单上手

    大家好,我是IT修真院深圳分院第18期学员,一枚正直善良的JAVA程序员。 今天给大家分享一下,修真院官网JAVA...

  • Vuex简单上手

    Vuex Vuex是Vue.js应用的状态管理模式目前开发项目中,主要用于保存组件状态,保证兄弟组件间的通信。 首...

  • Fastjson 简单上手

    fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为J...

  • momentjs简单上手

    最近在开发中遇到下面一些需求场景 场景一:以当前时间为基准获取前后n年作为时间范围作为接口入参 场景二:以指定时间...

  • vue

    angular: 国外 上手难 庞大 vue: 国产 上手简单 小巧 下载:1.官网下...

网友评论

      本文标题:spark-mongodb简单上手

      本文链接:https://www.haomeiwen.com/subject/xbfmeftx.html