前言:什么是spark?
Spark是一个通用的分布式数据处理引擎,可以处理大规模的数据。它是一个快速、通用、可扩展的大数据分析引擎,支持批处理和流处理。Spark的一个显著特点是它能够在内存中进行迭代计算,从而加快数据处理速度。
(1) 离线数据处理(MapReduce)
(2) 实时流数据处理
(3) 交互式查询
(4) 机器学习
(5) 图计算
为什么要用spark?不是已经会hadoop了吗?
由于Hadoop MapReduce只能进行离线海量数据的分析,且性能较差,而Spark性能好,支持的场景多,在企业应用也多,它可以替代MapReduce。因此在部署完Hadoop集群后,还要部署Spark集群,后续使用Spark来完成相应的大数据分析处理。
那spark有什么特点呢
- 高性能。Spark拥有DAG执行引擎,支持在内存中对数据进行迭代计算。如果数据由磁盘读取,速度是Hadoop MapReduce的10倍以上,如果数据从内存中读取,速度可以高达100多倍
- 易用。支持多种语言开发。如Scala、Java、Python、R等
- 通用。可应用在多种场景/领域。如离线数据处理、实时流数据处理、交互式查询、机器学习、图计算等
- 兼容。可以支持多种数据源(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();
}
}
这是分组求最值问题,我们可以
- 读文件得到普通RDD,此时RDD的元素的数据类型是String(目的是先得到原始的RDD)
- 将RDD的String转成数据类类型的对象(先转成数据类对象,后续通过getter方法获取相应属性)
- 将数据类类型的普通RDD转成键值对RDD(只有转成键值对,后续才能使用groupByKey进行分组)
- 对键值对RDD进行分组
- 使用map算子对分组后的键值对RDD的元素进行转换,然后遍历每一组的值,计算出所求的最大值
- 将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讲的知识点不是很多,但是关键在于去理解,每个模块如何去工作、怎么去使用。
分享到此结束希望对大家有用。