Spark实现销量统计
package com.mengyao.examples.spark.core; import java.io.Serializable; import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
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.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction; import scala.Tuple2; /**
* 国内乘用车4月、1-4月销量数据统计
* @author mengyao
*
*/
@SuppressWarnings("all")
public class CarSaleStatistics { static class Sale implements Serializable {
private static final long serialVersionUID = -5393067134730174480L;
//排名
private int no;
//车型
private String model;
//车企
private String brand;
//4月销量
private int fourSale;
//1-4月累计销量
private int totalSale;
public Sale(int no, String model, String brand, int fourSale, int totalSale) {
this.no = no;
this.model = model;
this.brand = brand;
this.fourSale = fourSale;
this.totalSale = totalSale;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public int getFourSale() {
return fourSale;
}
public void setFourSale(int fourSale) {
this.fourSale = fourSale;
}
public int getTotalSale() {
return totalSale;
}
public void setTotalSale(int totalSale) {
this.totalSale = totalSale;
}
@Override
public String toString() {
return no + "\t" + model + "\t" + brand + "\t" + fourSale + "\t" + totalSale;
}
} /**
* 集群模式:spark-submit --class com.mengyao.examples.spark.core.CarSaleStatistics --master yarn --deploy-mode cluster --driver-memory 2048m --executor-memory 1024m --executor-cores 1 --queue default examples-0.0.1-SNAPSHOT.jar /data/carsales_data/2018.4-china-car-sales_volume.txt /data/carsales_data/statistics/
* 本地模式:Run As > Java Application
* @param args [in,out]
*/
public static void main(String[] args) {
SparkConf conf = new SparkConf()
.setAppName(CarSaleStatistics.class.getName());
if (null==args||args.length==0) {
args = new String[]{"./src/main/resources/data/2018.4-china-car-sales_volume.txt", "D:/"};
System.setProperty("hadoop.home.dir", "D:/softs/dev/apache/hadoop-2.7.5");
conf.setMaster("local");
}
JavaSparkContext sc = new JavaSparkContext(conf);
//中国市场合资、国产乘用车4月分销量数据
JavaRDD<String> linesRDD = sc.textFile(args[0]);
//按品牌分组
JavaPairRDD<String, Sale> brandSalesRDD = linesRDD.mapToPair(new PairFunction<String, String, Sale>() {
private static final long serialVersionUID = -3023653638555855696L;
@Override
public Tuple2<String, Sale> call(String line) throws Exception {
String[] fields = line.split("\t");
Sale sale = new Sale(Integer.parseInt(fields[0]), fields[1], fields[2], Integer.parseInt(fields[3]), Integer.parseInt(fields[4]));
return new Tuple2<String, Sale>(sale.getBrand(), sale);
}
});
//同品牌4月总销量、1-4月总销量
JavaPairRDD<String, Sale> brandTotalSalesRDD = brandSalesRDD.reduceByKey(new Function2<Sale, Sale, Sale>() {
private static final long serialVersionUID = 1L;
@Override
public Sale call(Sale item1, Sale item2) throws Exception {
item2.setFourSale(item1.getFourSale()+item2.getFourSale());
item2.setTotalSale(item1.getTotalSale()+item2.getTotalSale());
item2.setModel(item1.getModel()+","+item2.getModel());
return item2;
}
});
//4月份销量排名,转换key为4月销量
JavaPairRDD<Integer, Sale> fourSaleRankRDD = brandTotalSalesRDD.mapToPair(new PairFunction<Tuple2<String,Sale>, Integer, Sale>() {
private static final long serialVersionUID = 2012736852338064223L;
@Override
public Tuple2<Integer, Sale> call(Tuple2<String, Sale> t) throws Exception {
return new Tuple2<Integer, Sale>(t._2.getFourSale(), t._2);
}
});
//4月份销量排名降序
JavaPairRDD<Integer, Sale> fourSaleRankDescRDD = fourSaleRankRDD.sortByKey(false);
fourSaleRankDescRDD.foreach(new VoidFunction<Tuple2<Integer,Sale>>() {
private static final long serialVersionUID = -8110929872210046547L;
@Override
public void call(Tuple2<Integer, Sale> t) throws Exception {
Sale sale = t._2;
System.out.println("==== 4月份销量排名:"+sale.getBrand()+" = "+sale.getFourSale());
}
});
fourSaleRankDescRDD.saveAsNewAPIHadoopFile(args[1]+"fourSaleRank", NullWritable.class, Text.class, TextOutputFormat.class); //1-4月份累计销量排名,转换key为1-4月销量
JavaPairRDD<Integer, Sale> totalSaleRankRDD = brandTotalSalesRDD.mapToPair(new PairFunction<Tuple2<String,Sale>, Integer, Sale>() {
private static final long serialVersionUID = 2012736852338064223L;
@Override
public Tuple2<Integer, Sale> call(Tuple2<String, Sale> t) throws Exception {
return new Tuple2<Integer, Sale>(t._2.getTotalSale(), t._2);
}
});
//1-4月份累计销量排名降序
JavaPairRDD<Integer, Sale> totalSaleRankDescRDD = totalSaleRankRDD.sortByKey(false);
totalSaleRankDescRDD.foreach(new VoidFunction<Tuple2<Integer,Sale>>() {
private static final long serialVersionUID = -8110929872210046547L;
@Override
public void call(Tuple2<Integer, Sale> t) throws Exception {
Sale sale = t._2;
System.out.println("==== 1-4月份累计销量排名:"+sale.getBrand()+" = "+sale.getTotalSale());
}
});
fourSaleRankDescRDD.saveAsNewAPIHadoopFile(args[1]+"oneTofourSaleRank", NullWritable.class, Text.class, TextOutputFormat.class);
//关闭
sc.close();
} }
查看HDP Spark的HistoryServer(IP,18081),如下图表示成功:

Spark实现销量统计的更多相关文章
- Spark MLib 基本统计汇总 2
4. 假设检验 基础回顾: 假设检验,用于判断一个结果是否在统计上是显著的.这个结果是否有机会发生. 显著性检验 原假设与备择假设 常把一个要检验的假设记作 H0,称为原假设(或零假设) (null ...
- Spark MLib 基本统计汇总 1
1. 概括统计 summary statistics MLlib支持RDD[Vector]列式的概括统计,它通过调用 Statistics 的 colStats方法实现. colStats返回一个 ...
- Spark Streaming 002 统计单词的例子
1.准备 事先在hdfs上创建两个目录: 保存上传数据的目录:hdfs://alamps:9000/library/SparkStreaming/data checkpoint的目录:hdfs://a ...
- [Spark Core] Spark 实现气温统计
0. 说明 聚合气温数据,聚合出 MAX . MIN . AVG 1. Spark Shell 实现 1.1 MAX 分步实现 # 加载文档 val rdd1 = sc.textFile(" ...
- spark 累加历史 + 统计全部 + 行转列
spark 累加历史主要用到了窗口函数,而进行全部统计,则需要用到rollup函数 1 应用场景: 1.我们需要统计用户的总使用时长(累加历史) 2.前台展现页面需要对多个维度进行查询,如:产品.地 ...
- spark 省份次数统计实例
//统计access.log文件里面IP地址对应的省份,并把结果存入到mysql package access1 import java.sql.DriverManager import org.ap ...
- spark复习笔记(3):使用spark实现单词统计
wordcount是spark入门级的demo,不难但是很有趣.接下来我用命令行.scala.Java和python这三种语言来实现单词统计. 一.使用命令行实现单词的统计 1.首先touch一个a. ...
- spark jdk8 单词统计示例
在github上有spark-java8 实例地址: https://github.com/ypriverol/spark-java8 https://github.com/ihr/java8-spa ...
- Spark入门案例 - 统计单词个数 / wordcount
Scala版 import org.apache.spark.{SparkConf, SparkContext} object WordCountScala { def main(args: Arra ...
随机推荐
- sublime Text3 设置用新标签页打开新的文件
今天用sublime Text3 打开项目文件,发现单击文件就可以打开,但是有一个问题:每次打开新文件就会覆盖当前的标签页,无法在新的标签页打开.于是在网上查了一下. 网上有人说在Preference ...
- str.substring(beginIndex,endIndex)-008
// 将字符串str前n位放在后面,返回新的字符串 public String headToTail(String str,int n){ if(n==0){ System.out.println(s ...
- Java字符串2
if(str!= null && str.isEmpty()){ dao.get(str); } str.isEmpty判断字符串是否为空字符串
- Bootstrap 折叠(collapse) 初见
以下代码来自bootstrap中文网 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta c ...
- 【bzoj1692】[Usaco2007 Dec]队列变换 贪心+后缀数组
题目描述 FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席前依次走过. ...
- mysql 迁移 mariadb
背景: mysql5.7数据库安装在windows环境中,数据需要迁移到CentOS7.4的mariadb5.5中.web应用是采用springboot2.x开发的,迁移数据完成后,还需要简单修改一些 ...
- 【题解】JXOI2017颜色
一眼线段树...显然,我们可以考虑最后所留下的区间,那显然这个区间中应当不能存在任何与区间外相同的颜色.这里的转化也是很常用的,我们用 \(nxt[i]\) 表示与 \(i\) 颜色相同的下一个位置在 ...
- BZOJ3534:[SDOI2014]重建——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3534 https://www.luogu.org/problemnew/show/P3317 T国 ...
- BZOJ1040:[ZJOI2008]骑士——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题面大意:n个人有一个价值和一个最恨的人,现在组出一个队伍使得价值最大且没有仇恨关系. ——— ...
- MySQL - General error: 1390 Prepared statement contains too many placeholders
报错原因:预处理 SQL语句时使用的占位符数量超过了最大限制(默认65535). 解决方案:拆分查询语句,每次使用的占位符低于限制即可.