spark技术实战

前言:什么是spark?

            Spark是一个通用的分布式数据处理引擎,可以处理大规模的数据。它是一个快速、通用、可扩展的大数据分析引擎,支持批处理和流处理。Spark的一个显著特点是它能够在内存中进行迭代计算,从而加快数据处理速度。

   由加州大学伯克利分校AMP实验室开发的通 用内存并行计算框架
  它可以应用在:

    (1) 离线数据处理(MapReduce

    (2) 实时流数据处理

    (3) 交互式查询

    (4) 机器学习

    (5) 图计算

为什么要用spark?不是已经会hadoop了吗?

            由于Hadoop MapReduce只能进行离线海量数据的分析,且性能较差,而Spark性能好,支持的场景多,在企业应用也多它可以替代MapReduce。因此在部署完Hadoop集群后,还要部署Spark集群,后续使用Spark来完成相应的大数据分析处理。

那spark有什么特点呢

  1. 高性能。Spark拥有DAG执行引擎,支持在内存中对数据进行迭代计算。如果数据由磁盘读取,速度是Hadoop MapReduce的10倍以上,如果数据从内存中读取,速度可以高达100多倍
  2. 易用。支持多种语言开发。如Scala、Java、Python、R等
  3. 通用。可应用在多种场景/领域。如离线数据处理、实时流数据处理、交互式查询、机器学习、图计算等
  4. 兼容。可以支持多种数据源(HDFS、HBase、S3等)、多种资源调度框架(如YARN、Mesos、Standalone等)

​​​其余的去别处去了解吧,咱们直接上干货

package com.lzzy;

import com.google.gson.Gson;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.PairFunction;
import scala.Tuple2;

import java.util.List;
import java.util.Objects;

public class a {
    public static void main(String[] args) {
        SparkConf sparkConf = new SparkConf().setAppName("a").setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(sparkConf);
        sparkConf.set("spark.driver.host", "localhost");
        // 读数据文件,得到一个RDD
        JavaRDD<String> rdd = sc.textFile("网站销售订单库2.json");
        JavaPairRDD<String, Data> kvRdd = rdd.mapToPair(new PairFunction<String, String, Data>() {
            @Override
            public Tuple2<String, Data> call(String s) throws Exception {
                Gson gson = new Gson();
                Data data = gson.fromJson(s,Data.class);
                return new Tuple2<>(data.get地区(),data);
            }
        });
        // 分组聚合
        JavaPairRDD<String,Iterable<Data>> g = kvRdd.groupByKey();

        JavaRDD<Tuple2<String,Data>> resRdd = g.map(new Function<Tuple2<String, Iterable<Data>>, Tuple2<String, Data>>() {
            @Override
            public Tuple2<String, Data> call(Tuple2<String, Iterable<Data>> t) throws Exception {
                Data max =null;
                for (Data c : t._2){
                    if (Objects.isNull(max)){
                        max = c;
                    }else{
                        if (c.get销售额().intValue() > max.get销售额().intValue()){
                            max = c;
                        }
                    }
                }
                return new Tuple2<>(t._1,max);
            }
        });
        List<Tuple2<String,Data>> list = resRdd.take(10);
        for (Tuple2<String,Data> t : list){
            System.out.printf("%s地区最高销售额为:%s%n",t._1,t._2.get销售额());
        }
        sc.stop();
    }
    }

这是分组求最值问题,我们可以

  1. 读文件得到普通RDD,此时RDD的元素的数据类型是String(目的是先得到原始的RDD
  2. 将RDD的String转成数据类类型的对象(先转成数据类对象,后续通过getter方法获取相应属性
  3. 将数据类类型的普通RDD转成键值对RDD(只有转成键值对,后续才能使用groupByKey进行分组)
  4. 对键值对RDD进行分组
  5. 使用map算子对分组后的键值对RDD的元素进行转换,然后遍历每一组的值,计算出所求的最大值
  6. 将map返回的RDD的元素输出到控制台
package com.lzzy;
import org.apache.spark.sql.*;

public class b {
    public static void main(String[] args) {
        SparkSession ss = SparkSession.builder().appName("b").master("local").getOrCreate();
        Dataset<Row> data = ss.read().json("网站销售订单库2.json");
         // 计算各个地区的总销售订单数
        data.groupBy("地区").count().orderBy(new Column("count").desc()).show();
        ss.stop();
    }

}

简单的mysql调用,用groupBy进行分组,count计数,orderBy进行升降序处理,最后show输出。

网站销售订单库: 数据,仅提供学习

 总结

           学习了spark之后我才知道Hadoop和spark还有着这种缘分:Hadoop 是由Java语言编写的,部署在分布式服务器集群上,用于存储海量数据并运行分布式分析应用的开源框架;其重要组件有,HDFS 分布式文件系统、MapReduce 编程模型、Hbase 基于HDFS的分布式数据库:擅长实时随机读/写超大规模数据集。

          要学习好spark,scala语言的学习至关重要, 学习Spark需要将基础和实践结合起来,很多的基础知识在Hadoop中基础知识之上进行学习,只有去体验实际操作才能体会到区别。整个Spark讲的知识点不是很多,但是关键在于去理解,每个模块如何去工作、怎么去使用。

          分享到此结束希望对大家有用。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值