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实现销量统计的更多相关文章

  1. Spark MLib 基本统计汇总 2

    4. 假设检验 基础回顾: 假设检验,用于判断一个结果是否在统计上是显著的.这个结果是否有机会发生. 显著性检验 原假设与备择假设 常把一个要检验的假设记作 H0,称为原假设(或零假设) (null ...

  2. Spark MLib 基本统计汇总 1

    1.  概括统计 summary statistics MLlib支持RDD[Vector]列式的概括统计,它通过调用 Statistics 的 colStats方法实现. colStats返回一个  ...

  3. Spark Streaming 002 统计单词的例子

    1.准备 事先在hdfs上创建两个目录: 保存上传数据的目录:hdfs://alamps:9000/library/SparkStreaming/data checkpoint的目录:hdfs://a ...

  4. [Spark Core] Spark 实现气温统计

    0. 说明 聚合气温数据,聚合出 MAX . MIN . AVG 1. Spark Shell 实现 1.1 MAX 分步实现 # 加载文档 val rdd1 = sc.textFile(" ...

  5. spark 累加历史 + 统计全部 + 行转列

    spark 累加历史主要用到了窗口函数,而进行全部统计,则需要用到rollup函数 1  应用场景: 1.我们需要统计用户的总使用时长(累加历史) 2.前台展现页面需要对多个维度进行查询,如:产品.地 ...

  6. spark 省份次数统计实例

    //统计access.log文件里面IP地址对应的省份,并把结果存入到mysql package access1 import java.sql.DriverManager import org.ap ...

  7. spark复习笔记(3):使用spark实现单词统计

    wordcount是spark入门级的demo,不难但是很有趣.接下来我用命令行.scala.Java和python这三种语言来实现单词统计. 一.使用命令行实现单词的统计 1.首先touch一个a. ...

  8. spark jdk8 单词统计示例

    在github上有spark-java8 实例地址: https://github.com/ypriverol/spark-java8 https://github.com/ihr/java8-spa ...

  9. Spark入门案例 - 统计单词个数 / wordcount

    Scala版 import org.apache.spark.{SparkConf, SparkContext} object WordCountScala { def main(args: Arra ...

随机推荐

  1. google go语言开发

    C:cd C:\Program Files\go\gopath\src\opmsset GOOS=linuxset GOARCH=amd64set CGO_ENABLED=0make.batgo in ...

  2. [计算机网络-应用层] DNS:因特网的目录服务

    我们知道有两种方式可以识别主机:通过主机名或者IP地址.人们喜欢便于记忆的主机名标识,而路由器则喜欢定长的.有着层次结构的IP地址.为了折中这些不同的偏好,我们需要一种能进行主机名到IP地址转换的目录 ...

  3. bzoj3676-回文串

    给出一个字符串,一个子串的出现值为字串出现次数乘以长度,求所有回文串中最大的出现值. 分析 回文自动机模版题,建出自动机后直接统计即可. 回文自动机 类似于后缀自动机,不过一条边\((u,v,c)\) ...

  4. (转)超详细单机版搭建hadoop环境图文解析

                        超详细单机版搭建hadoop环境图文解析   安装过程: 一.安装Linux操作系统 二.在Ubuntu下创建hadoop用户组和用户 三.在Ubuntu下安装 ...

  5. hadoop 把mapreduce任务从本地提交到hadoop集群上运行

    MapReduce任务有三种运行方式: 1.windows(linux)本地调试运行,需要本地hadoop环境支持 2.本地编译成jar包,手动发送到hadoop集群上用hadoop jar或者yar ...

  6. 【题解】CF#855 G-Harry Vs Voldemort

    个人感觉挺有意思的,然而被颜神D无聊惹(- ̄▽ ̄)- 这题我们可以首先试图去统计以每一个点作为 w 点所能对答案造成的贡献是多少.不难发现,当且仅当 u 和 v 都在 w 所在边双的一侧的时候不能构成 ...

  7. POJ2987:Firing——题解

    http://poj.org/problem?id=2987 题目大意: 炒掉一个人能够获得b收益(b可以<0),但是炒掉一个人必须得炒掉他的下属(然后继续递归). 求最大收益和此时最小裁员. ...

  8. 洛谷 P1516 青蛙的约会 解题报告

    P1516 青蛙的约会 题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件 ...

  9. vue-router的钩子

    vue-router的钩子分为三类: 1. 全局钩子2. 路由独享钩子3. 组件内钩子 1. 全局钩子 beforeEach(to,from,next) afterEach(route) 2. 路由独 ...

  10. 初学VS的目录结构

    工程目录下各文件的含义 一般大部分的文章可能介绍到上面就算结束了,但我这还没有.创建工程产生的各个文件都你知道是什么用的吗? 如果你是一个初学者,你可能会不知道(老手请跳过本文).Ok,我就带你逐一了 ...