企业spark案例 —出租车轨迹分析

企业spark案例 —— 出租车轨迹分析

一、数据清洗

学习目标

1.如何使用 SparkSQL 读取 CSV 文件
2.如何使用正则表达式清洗掉多余字符串。

将出租车轨迹数据规整化,清洗掉多余的字符串,并使用 DataFrame.show() 打印输出。
在这里插入图片描述

清洗掉红框里面的 $ 、@ 字符,由于这两字符出现的次数没有规律,所以需要使用正则匹配。

清洗后内容如下:

在这里插入图片描述

import org.apache.spark.sql.SparkSession


object Step1 {
    def main(args: Array[String]): Unit = {
        val spark = SparkSession.builder().appName("Step1").master("local").getOrCreate()

        /**********begin**********/
        val frame = spark.read.option("header", true).option("delimiter", "\t").csv("/root/data.csv")
        frame.createTempView("data")
        spark.udf.register("cleanData", (x: String) => {
            x.replaceAll("\\@+", "").replaceAll("\\$+", "")
        })
        spark.sql(
        """
            |select cleanData(TRIP_ID) as TRIP_ID,cleanData(CALL_TYPE) as CALL_TYPE,cleanData(ORIGIN_CALL) as ORIGIN_CALL,
            |cleanData(TAXI_ID) as TAXI_ID,cleanData(ORIGIN_STAND) as ORIGIN_STAND ,cleanData(TIMESTAMP) as TIMESTAMP,
            |cleanData(POLYLINE) as POLYLINE
            |from data
        """.stripMargin).show()
        /**********end**********/
        spark.stop()
    }
}
            

二、数据分析

使用SparkSQL完成数据分析



import com.alibaba.fastjson.JSON
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.StringType

object Step2 {
    def main(args: Array[String]): Unit = {
        val spark = SparkSession.builder().appName("Step1").master("local").getOrCreate()
        spark.sparkContext.setLogLevel("error")

        /**********begin**********/
        val frame = spark.read.option("header", true).option("delimiter", "\t").csv("/root/data2.csv")
        frame.createTempView("data")
        //1.将时间戳转换成时间
        spark.sql("select TRIP_ID,CALL_TYPE,ORIGIN_CALL,TAXI_ID,ORIGIN_STAND,POLYLINE, from_unixtime(TIMESTAMP,'yyyy-MM-dd') as TIME from data").createTempView("data2")
        spark.sql("select * from data2").show()
        //2.将POLYLINE字段,分离出startLocation,endLocation 两个字段
        spark.udf.register("startLocation", (x: String) => {
        val arr = JSON.parseArray(x)
        arr.get(0).toString
        })
        spark.udf.register("endLocation", (x: String) => {
        val arr = JSON.parseArray(x)
        arr.get(arr.size() - 1).toString
        })
        spark.sql(
        """
            |select TRIP_ID,CALL_TYPE,ORIGIN_CALL,TAXI_ID,ORIGIN_STAND,POLYLINE,TIME,startLocation(POLYLINE) as startLocation,endLocation(POLYLINE) as endLocation  from data2
        """.stripMargin).createTempView("data3")
        spark.sql("select * from data3").show()
        //3.计算时长,行程的总行程时间定义为(点数-1)×15秒。
        // 例如,POLYLINE中具有101个数据点的行程具有(101-1* 15 = 1500秒的长度
        spark.udf.register("timeLen", (x: String) => {
        (JSON.parseArray(x).size() - 1) * 15
        })
        spark.sql(
        """
            |select TRIP_ID,CALL_TYPE,ORIGIN_CALL,TAXI_ID,ORIGIN_STAND,POLYLINE,TIME,startLocation(POLYLINE) as startLocation,endLocation(POLYLINE) as endLocation,timeLen(POLYLINE) as  timeLen  from data3
        """.stripMargin).createTempView("data4")
        spark.sql("select * from data4").show()
        //4.统计每天各种呼叫类型的数量并以CALL_TYPE,TIME升序排序
        spark.sql(
        """
            |select CALL_TYPE ,TIME,count(1) as num from data4 group by TIME,CALL_TYPE order by CALL_TYPE,TIME
        """.stripMargin).show()
        /**********end**********/
        spark.stop()
    }
}

三、出租车轨迹图表展示

使用springboot + echarts 编写一个展示的图表程序:
对此你需要了解可视化分为前后端,也就是我们的MVC设计模式:
在这里插入图片描述
M层:
MainMapper

package net.educoder.app.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface MainMapper {

    //参考
    @Select("SELECT _num from taxi_trend WHERE _taxi = #{type} ORDER BY _time")
    List<Integer> findTaxiTrendNumByType(String type);
    /**********begin**********/
    @Select("SELECT _time FROM taxi_trend GROUP BY _time ")
    List<String> findTaxiTrendTime();
    @Select("select _taxi from taxi_trend group by _taxi")
    List<String> findTaxiType();
    @Select("SELECT _type from taxi_servicenum GROUP BY _type")
    List<String> findTaxiPlatform();
    @Select("SELECT _serviceType FROM taxi_servicenum GROUP BY _serviceType ORDER BY _serviceType")
    List<String> findAllTaxiService();
    @Select("SELECT _num FROM taxi_servicenum WHERE _type = #{Platform} order BY _serviceType ")
    List<Integer> findServiceNumByPlatform(String Platform);    
    /**********end**********/
}

V层:
index.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<script src="echarts.min.js"></script>
<script src="jquery-3.1.1.min.js"></script>

<body>
<div id="main" style="width: 1000px;height:600px;"></div>
<div id="main2" style="width: 1000px;height:600px;"></div>
</body>
<script>
    var myChart = echarts.init(document.getElementById('main'));
    $.ajax({
        /**********begin**********/
        url: "/Line_Chart",
        /**********end**********/
        success: function (data) {
            option = {
                title: {
                    text: '各出租车平台年使用率'
                },
                tooltip: {
                    trigger: 'axis'
                },
                legend: {
                    data: ['A', 'B', 'C']
                },
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    containLabel: true
                },
                toolbox: {
                    feature: {
                        saveAsImage: {}
                    }
                },
                xAxis: {
                    type: 'category',
                    boundaryGap: false,
                    /**********begin**********/
                    data:data.timeList
                    /**********end**********/
                },
                yAxis: {
                    type: 'value'
                },
                /**********begin**********/
                series:data.resultData
                /**********end**********/
            };
            myChart.setOption(option);
        },
        dataType: "json",
        type: "post"
    });

    var myChart2 = echarts.init(document.getElementById('main2'));
    $.ajax({
        /**********begin**********/
        url:"/Radar_Chart",
        /**********end**********/
        success:function (data) {
            option = {
                title: {
                    text: '各平台各服务数量'
                },
                tooltip: {},
                legend: {
                    /**********begin**********/
                    data:data.taxiPlatform
                    /**********end**********/
                },
                radar: {
                    name: {
                        textStyle: {
                            color: '#fff',
                            backgroundColor: '#999',
                            borderRadius: 3,
                            padding: [3, 5]
                        }
                    },
                    /**********begin**********/
                    indicator:data.indicator
                    /**********end**********/
                },
                series: [{
                    type: 'radar',
                    /**********begin**********/
                    data:data.resultData
                    /**********end**********/
                }]
            };
            myChart2.setOption(option);
        },
        dataType:"json",
        type:"post"
    });
</script>

</html>

C层:
MainController :

package net.educoder.app.controller;

import net.educoder.app.entity.Chart_Line;
import net.educoder.app.entity.Chart_Radar;
import net.educoder.app.mapper.MainMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Controller
public class MainController {
    /**********begin**********/

    @Autowired
    MainMapper mainMapper;
    @RequestMapping("/index")
    public String index() {
        return "index";
    }
    @RequestMapping("/Line_Chart")
    @ResponseBody
    public Map<String, Object> Line_Chart() {
        List<String> taxiType = mainMapper.findTaxiType();
        Map<String, Object> map = new HashMap<>();
        List<Chart_Line> resultList = new ArrayList<>();
        for (String s : taxiType) {
            List<Integer> list = mainMapper.findTaxiTrendNumByType(s);
            Chart_Line chart_line = new Chart_Line(s, "line", list);
            resultList.add(chart_line);
        }
        List<String> taxiTrendTimeList = mainMapper.findTaxiTrendTime();
        map.put("timeList", taxiTrendTimeList);
        map.put("resultData", resultList);
        return map;
    }
    @RequestMapping("/Radar_Chart")
    @ResponseBody
    public Map<String, Object> Radar_Chart() {
        Map<String, Object> map = new HashMap<>();
        List<String> allTaxiService = mainMapper.findAllTaxiService();
        List<HashMap<String, Object>> indicatorList = new ArrayList<>();
        for (String s : allTaxiService) {
            HashMap<String, Object> stringIntegerHashMap = new HashMap<>();
            stringIntegerHashMap.put("name", s);
            stringIntegerHashMap.put("max", 100);
            indicatorList.add(stringIntegerHashMap);
        }
        List<String> taxiPlatform = mainMapper.findTaxiPlatform();
        List<Chart_Radar> resultList = new ArrayList<>();
        for (String s : taxiPlatform) {
            List<Integer> serviceNumByPlatform = mainMapper.findServiceNumByPlatform(s);
            Chart_Radar chart_radar = new Chart_Radar(s, serviceNumByPlatform);
            resultList.add(chart_radar);
        }
        map.put("resultData", resultList);
        map.put("legendData", taxiPlatform);
        map.put("indicator", indicatorList);
        return map;
    }

    /**********end**********/
}

  • 7
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这个企业Spark案例是关于出租车轨迹分析的。通过使用Spark技术,可以对出租车轨迹数据进行处理和分析,从而得出有关出租车行驶路线、速度、拥堵情况等方面的信息。这些信息可以帮助企业优化出租车调度和路线规划,提高出租车服务的效率和质量。同时,这个案例也展示了Spark大数据处理和分析方面的强大能力,为企业提供了更高效、更准确的数据分析解决方案。 ### 回答2: 出租车轨迹分析是一种典型的企业Spark案例,它运用大数据技术对城市出租车运行轨迹进行分析,旨在更好地了解城市交通流向、拥堵情况、客流量等,为城市规划和交通管理提供决策支持。 该系统的数据来源主要是出租车GPS定位数据和交通系统数据,运用Spark技术将海量数据进行处理和分析,获取有价值的信息。具体来说,该系统主要分为三个模块:数据采集、数据处理和数据展示。 在数据采集方面,系统需要获取城市出租车的实时位置信息,需要对出租车进行GPS定位和追踪,将出租车行驶的轨迹数据实时传输至数据处理模块,实现数据的实时收集和传输。 在数据处理方面,系统采用Spark Streaming技术实现实时流处理,对实时采集到的轨迹数据进行处理,筛选出有用的信息,如城市交通流向、热门拥堵路段、客流高峰时段等,并将这些信息实时传输到数据展示模块。 在数据展示方面,系统采用可视化技术,将通过实时处理得到的信息展示在地图上,包括城市交通热力图、热门拥堵点、客流高峰路段等,使用户可以直观地了解城市交通情况,帮助决策者提高交通效率,创造更好的城市交通生活。 总之,企业Spark案例——出租车轨迹分析,运用大数据技术提升城市交通管理水平,为城市交通建设和规划提供有力支持,具有很大的价值和应用前景。 ### 回答3: 出租车轨迹分析是一项十分重要的技术,对于城市交通规划和出租车业务管理,以及出租车司机日常工作都有着重大的意义。通过对出租车轨迹数据进行分析,可以获得很多有用的信息,比如出租车的行驶模式、常用行驶路线、交通拥堵情况等,这些信息可以帮助出租车公司优化出租车调度、提高业务效率,提高乘客满意度。 企业 Spark案例——出租车轨迹分析,利用 Spark 进行数据处理和分析,实现对大规模出租车轨迹数据的实时处理和可视化,为出租车公司和城市交通规划部门提供了非常有价值的技术支持。 出租车轨迹分析的具体流程如下: 1、数据采集:利用 GPS 定位技术,对出租车进行实时定位,将出租车的实时位置信息记录下来,形成出租车轨迹数据。 2、数据预处理:对采集到的出租车轨迹数据进行清洗和预处理,去除异常点和误差数据,形成完整的轨迹数据。 3、数据存储:将预处理后的轨迹数据存储到 Hadoop 集群中,利用 Spark 进行数据处理和分析。 4、数据分析:通过 Spark 进行实时的数据处理和分析,对出租车轨迹数据进行聚类分析、热度分析等多种分析方法,计算出不同时间段和不同区域内的出租车数量、出租车行驶速度、常用行驶路线等信息。 5、数据可视化:将分析结果可视化展示,利用地图等工具将轨迹数据绘制成热力图、聚类图等形式,为城市交通规划部门、出租车公司和出租车司机提供有用的参考信息。 通过企业 Spark案例 —— 出租车轨迹分析,可以实现对大规模出租车轨迹数据的实时处理和可视化展示,为城市交通规划和出租车业务管理提供了非常有用的技术支持。随着城市交通的发展和数据采集技术的不断进步,出租车轨迹分析技术将越来越受到重视,企业需要积极采用这一技术,将其应用于出租车业务管理和城市交通规划中,促进城市交通的发展和出租车业务的提升。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值