基于Hadoop的天气数据分析可视化系统
基于Spark的西南天气数据分析与应用系统

前言介绍

本文围绕基于Spark的西南天气数据分析展开研究。西南地区地形复杂、天气多变,气象数据对当地生态、农业、交通等领域至关重要。通过多数据源采集西南地区长时间序列天气数据,利用大数据技术Hadoop,Spark和hive等技术对原始数据进行清洗、转换与集成,构建高质量气象数据集。从空气质量、白天和夜晚天气状况、高温、风向、降水等多个维度对数据进行深入分析,并借助Matplotlib、Seaborn、Plotly Express等库进行可视化展示。同时,紧密结合农业、交通、能源等行业需求,分析天气数据与行业活动的关联,如构建农业气象灾害预警模型、依天气调整交通管制措施、为能源生产与调度提供决策支持等。研究表明,基于Spark的大数据分析技术能有效处理西南地区气象数据,为各行业提供有价值的决策参考,助力西南地区气象服务与发展。

01开发环境

1.1Java 技术

1.2Spring Boot 框架

1.3Hadoop,spark,hive

1.4Scrapy爬虫

1.5MySQL数据库

1.6B/S 结构

1.7Vue.js 技术

02系统功能亮点

亮点(爬虫【天气预报24小时详情网站】、数据备份、数据分析、大屏看板、Echarts可视化)

1、数据管理:爬虫信息列表展示。

2、数据存储:mysql数据库。

3、可视化分析:各种数据分析统计后图表大屏展示

4、数据分析:根据hadoop大数据技术进行数据分析

03图片展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

04部分代码展示

 //(交流学习+vx:S20231025S )
 @RequestMapping("/value/{xColumnName}/{yColumnName}")
    public R value(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName,HttpServletRequest request) throws IOException {

        //读取文件,如果文件存在,则优先返回文件内容

        java.nio.file.Path path = java.nio.file.Paths.get("value_tianqiinfo_" + xColumnName + "_" + yColumnName + "_timeType.json");

        if(java.nio.file.Files.exists(path)) {

            String content = new String(java.nio.file.Files.readAllBytes(path), java.nio.charset.StandardCharsets.UTF_8);

            return R.ok().put("data", (new org.json.JSONArray(content)).toList());

        }

        //构建查询统计条件

        Map<String, Object> params = new HashMap<String, Object>();

        params.put("xColumn", xColumnName);

        params.put("yColumn", yColumnName);

        EntityWrapper<TianqiinfoEntity> ew = new EntityWrapper<TianqiinfoEntity>();

            //获取结果

        List<Map<String, Object>> result = tianqiinfoService.selectValue(params, ew);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        for(Map<String, Object> m : result) {

            for(String k : m.keySet()) {

                if(m.get(k) instanceof Date) {

                    m.put(k, sdf.format((Date)m.get(k)));

                }

            }

        }

        Collections.sort(result, (map1, map2) -> {

            // 假设 total 总是存在并且是数值类型

            Number total1 = (Number) map1.get("total");

            Number total2 = (Number) map2.get("total");

            if(total1==null)

            {

                total1 = 0;

            }

            if(total2==null)

            {

                total2 = 0;

            }

            return Double.compare(total2.doubleValue(), total1.doubleValue());

        });

        return R.ok().put("data", result);

    }
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐