Hadoop综合项目——二手房统计分析(MapReduce篇)

news2025/7/3 11:07:48

Hadoop综合项目——二手房统计分析(MapReduce篇)

文章目录

  • Hadoop综合项目——二手房统计分析(MapReduce篇)
    • 0、 写在前面
    • 1、MapReduce统计分析
      • 1.1 统计四大一线城市房价的最值
      • 1.2 按照城市分区统计二手房数量
      • 1.3 根据二手房信息发布时间排序统计
      • 1.4 统计二手房四大一线城市总价Top5
      • 1.5 基于二手房总价实现自定义分区全排序
      • 1.6 基于建造年份和房子总价的二次排序
      • 1.7 自定义类统计二手房地理位置对应数量
      • 1.8 统计二手房标签的各类比例
    • 2、数据及源代码
    • 3、总结


在这里插入图片描述


0、 写在前面

  • Windows版本:Windows10
  • Linux版本:Ubuntu Kylin 16.04
  • JDK版本:Java8
  • Hadoop版本:Hadoop-2.7.1
  • Hive版本:Hive1.2.2
  • IDE:IDEA 2020.2.3
  • IDE:Pycharm 2021.1.3
  • IDE:Eclipse3.8

1、MapReduce统计分析

通过MapReduce对最值、排序、TopN、自定义分区排序、二次排序、自定义类、占比等8个方面的统计分析

1.1 统计四大一线城市房价的最值

  • 分析目的:

二手房房价的最值是体现一个城市经济的重要因素,也是顾客购买的衡量因素之一。

  • 代码:

Driver端:

public class MaxMinTotalPriceByCityDriver {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "MaxMinTotalPriceByCity");
        job.setJarByClass(MaxMinTotalPriceByCityDriver.class);
        job.setMapperClass(MaxMinTotalPriceByCityMapper.class);
        job.setReducerClass(MaxMinTotalPriceByCityReducer.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        FileInputFormat.setInputPaths(job, new Path("datas/tb_house.txt"));
        FileOutputFormat.setOutputPath(job, new Path("MapReduce/out/MaxMinTotalPriceByCity"));
        job.waitForCompletion(true);
    }
}
  • Mapper端:
public class MaxMinTotalPriceByCityMapper extends Mapper<Object, Text, Text, IntWritable> {
    private Text outk = new Text();
    private IntWritable outv = new IntWritable();
    @Override
    protected void map(Object key, Text value, Context out) throws IOException, InterruptedException {
        String line = value.toString();
        String[] data = line.split("\t");
        outk.set(data[1]);      // city
        outv.set(Integer.parseInt(data[6]));        // total
        out.write(outk, outv);
    }
}

Reducer端:

public class MaxMinTotalPriceByCityReducer extends Reducer<Text, IntWritable, Text, Text> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        List<Integer> totalList = new ArrayList<Integer>();
        Iterator<IntWritable> iterator = values.iterator();
        while (iterator.hasNext()) {
            totalList.add(iterator.next().get());
        }
        Collections.sort(totalList);
        int max = totalList.get(totalList.size() - 1);
        int min = totalList.get(0);
        Text outv = new Text();
        outv.set("房子总价最大、小值分别为:" + String.valueOf(max) + "万元," + String.valueOf(min) + "万元");
        context.write(key, outv);
    }
}
  • 运行情况:

    ![tp](https://img-blog.csdnimg.cn/98168d46e7ac49e5adcd76a309ee6041.png)
    
  • 结果:

    tp

1.2 按照城市分区统计二手房数量

  • 分析目的:

二手房的数量是了解房子基本情况的维度之一,数量的多少在一定程度上体现了房子的受欢迎度。

  • 代码:

tp

Driver端:

public class HouseCntByCityDriver {
    public static void main(String[] args) throws Exception {
        args = new String[] { "/input/datas/tb_house.txt", "/output/HouseCntByCity" };
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://node01:9000");
        Job job = Job.getInstance(conf, "HouseCntByCity");
        job.setJarByClass(HouseCntByCityDriver.class);
        job.setMapperClass(HouseCntByCityMapper.class);
        job.setReducerClass(HouseCntByCityReducer.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        job.setPartitionerClass(CityPartitioner.class);
        job.setNumReduceTasks(4);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        job.waitForCompletion(true);
    }
}

Mapper端:

public class HouseCntByCityMapper extends Mapper<Object, Text, Text, IntWritable> {
    private Text outk = new Text();
    private IntWritable outv = new IntWritable(1);
    @Override
    protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString();
        String[] data = line.split("\t");
        outk.set(new Text(data[1]));
        context.write(outk, outv);
    }
}

Reducer端:

public class HouseCntByCityReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) sum += val.get();
        context.write(key, new IntWritable(sum));
    }
}
  • 运行情况:

tp

  • 结果:

tp

1.3 根据二手房信息发布时间排序统计

  • 分析目的:

二手房的信息发布时间是了解房子基本情况的维度之一,在一定程度上,顾客倾向于最新的房源信息。

  • 代码:

Driver端:

public class AcessHousePubTimeSortDriver {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        Configuration conf = new Configuration()
        Job job = Job.getInstance(conf, "AcessHousePubTimeSort");
        job.setJarByClass(AcessHousePubTimeSortDriver.class);
        job.setMapperClass(AcessHousePubTimeSortMapper.class);
        job.setReducerClass(AcessHousePubTimeSortReducer.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.setInputPaths(job, new Path("datas/tb_house.txt"));
        FileOutputFormat.setOutputPath(job, new Path("MapReduce/out/AcessHousePubTimeSort"));
        job.waitForCompletion(true);
    }
}

Mapper端:

public class AcessHousePubTimeSortMapper extends Mapper<Object, Text, Text, IntWritable> {
    private Text outk = new Text();
    private IntWritable outv = new IntWritable(1);
    @Override
    protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        String lines = value.toString();
        String data[] = lines.split("\t");
        String crawler_time = data[9], followInfo = data[4];
        String ct = crawler_time.substring(0, 10);
        int idx1 = followInfo.indexOf("|"), idx2 = followInfo.indexOf("发");
        String timeStr = followInfo.substring(idx1 + 1, idx2);
        String pubDate = "";
        try {
            pubDate = getPubDate(ct, timeStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        outk.set(new Text(pubDate));
        context.write(outk, outv);
    }
    public String getPubDate(String ct, String timeStr) throws ParseException{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date getTime = sdf.parse(ct);
        String getDate = sdf.format(getTime);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(getTime);
        if (timeStr.equals("今天")) {
            calendar.add(Calendar.DAY_OF_WEEK,-0);
        } else if (timeStr.contains("天")) {
            int i = 0;
            while (Character.isDigit(timeStr.charAt(i))) i++;
            int size = Integer.parseInt(timeStr.substring(0, i));
            calendar.add(Calendar.DAY_OF_WEEK, -size);
        } else {
            int i = 0;
            while (Character.isDigit(timeStr.charAt(i))) i++; 
            int size = Integer.parseInt(timeStr.substring(0, i));
            calendar.add(Calendar.MONTH, -size);
        }
        Date pubTime = calendar.getTime();
        String pubDate = sdf.format(pubTime);
        return pubDate;
    }
}

Reducer端:

public class AcessHousePubTimeSortReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) sum += val.get();
        context.write(key, new IntWritable(sum));
    }
}
  • 运行情况:

在这里插入图片描述

  • 结果:

tp

1.4 统计二手房四大一线城市总价Top5

  • 分析目的:

TopN是MapReduce分析最常见且必不可少的一个例子。

  • 代码:

Driver端:

public class TotalPriceTop5ByCityDriver {
    public static void main(String[] args) throws Exception {
        args = new String[] {  "datas/tb_house.txt", "MapReduce/out/TotalPriceTop5ByCity" };
        Configuration conf = new Configuration();
        if (args.length != 2) {
            System.err.println("Usage: TotalPriceTop5ByCity <in> <out>");
            System.exit(2);
        }
        Job job = Job.getInstance(conf);
        job.setJarByClass(TotalPriceTop5ByCityDriver.class);
        job.setMapperClass(TotalPriceTop5ByCityMapper.class);
        job.setReducerClass(TotalPriceTop5ByCityReducer.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setNumReduceTasks(1);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

Mapper端:

public class TotalPriceTop5ByCityMapper extends Mapper<Object, Text, Text, IntWritable> {
    private int cnt = 1;
    private Text outk = new Text();
    private IntWritable outv = new IntWritable();
    @Override
    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString();
        String[] data = line.split("\t");
        String city = data[1], totalPrice = data[6];
        outk.set(data[1]);
        outv.set(Integer.parseInt(data[6]));
        context.write(outk, outv);
    }
}

Reducer端:

public class TotalPriceTop5ByCityReducer extends Reducer<Text, IntWritable, Text, Text> {
   private Text outv = new Text();
   private int len = 0;
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        List<Integer> totalPriceList = new ArrayList<Integer>();
        Iterator<IntWritable> iterator = values.iterator();
        while (iterator.hasNext()) {
            totalPriceList.add(iterator.next().get());
        }
        Collections.sort(totalPriceList);
        int size = totalPriceList.size();
        String top5Str = "二手房总价Top5:";
        for (int i = 1; i <= 5; i++) {
            if (i == 5) {
                top5Str += totalPriceList.get(size - i) + "万元";
            } else {
                top5Str += totalPriceList.get(size - i) + "万元, ";
            }
        }
        outv.set(String.valueOf(top5Str));
        context.write(key, outv);
    }
}
  • 运行情况:

tp

  • 结果:

tp

1.5 基于二手房总价实现自定义分区全排序

  • 分析目的:

自定义分区全排序可以实现不同于以往的排序方式,展示效果与默认全排序可以体现出一定的差别。

  • 代码:
public class TotalOrderingPartition extends Configured implements Tool {
    static class SimpleMapper extends Mapper<Object, Text, Text, IntWritable> {
        @Override
        protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            IntWritable intWritable = new IntWritable(Integer.parseInt(key.toString()));
            context.write((Text) key, intWritable);
        }
    }
    static class SimpleReducer extends Reducer<Text, IntWritable, IntWritable, NullWritable> {
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            for (IntWritable value : values) {
                context.write(value, NullWritable.get());
            }
        }
    }
    @Override
    public int run(String[] args) throws Exception {
        Configuration conf = getConf();
        Job job = Job.getInstance(conf, "Total Order Sorting");
        job.setJarByClass(TotalOrderingPartition.class);
        job.setInputFormatClass(KeyValueTextInputFormat.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        job.setNumReduceTasks(3);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(IntWritable.class);
        job.setOutputValueClass(NullWritable.class);
        TotalOrderPartitioner.setPartitionFile(job.getConfiguration(), new Path(args[2]));
        InputSampler.Sampler<Text, Text> sampler = new InputSampler.SplitSampler<Text, Text>(5000, 10);
        InputSampler.writePartitionFile(job, sampler);
        job.setPartitionerClass(TotalOrderPartitioner.class);
        job.setMapperClass(SimpleMapper.class);
        job.setReducerClass(SimpleReducer.class);
        job.setJobName("TotalOrderingPartition");
        return job.waitForCompletion(true) ? 0 : 1;
    }
    public static void main(String[] args) throws Exception {
        args = new String[] { "datas/tb_house.txt", "MapReduce/out/TotalOrderingPartition/outPartition1", "MapReduce/out/TotalOrderingPartition/outPartition2" };
        int exitCode = ToolRunner.run(new TotalOrderingPartition(), args);
        System.exit(exitCode);
    }
}
  • 运行情况:

在这里插入图片描述

  • 结果:

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

1.6 基于建造年份和房子总价的二次排序

  • 分析目的:

某些时候按照一个字段的排序方式并不能让我们满意,二次排则是解决这个问题的一个方法。

  • 代码:

Driver端:

tp

Mapper端:

在这里插入图片描述

Reducer端:

在这里插入图片描述

  • 运行情况:

tp

  • 结果:

tp

1.7 自定义类统计二手房地理位置对应数量

  • 分析目的:

某些字段通过MapReduce不可以直接统计得到,这时采用自定义类的方式便可以做到。

  • 代码:

自定义类:

public class HouseCntByPositionTopListBean implements Writable {
    private Text info;
    private IntWritable cnt;
    public Text getInfo() {
        return info;
    }
    public void setInfo(Text info) {
        this.info = info;
    }
    public IntWritable getCnt() {
        return cnt;
    }
    public void setCnt(IntWritable cnt) {
        this.cnt = cnt;
    }
    @Override
    public void readFields(DataInput in) throws IOException {
        this.cnt = new IntWritable(in.readInt());
    }
    @Override
    public void write(DataOutput out) throws IOException {
        out.writeInt(cnt.get());
    }
    @Override
    public String toString() {
        String infoStr = info.toString();
        int idx = infoStr.indexOf("-");
        String city = infoStr.substring(0, idx);
        String position = infoStr.substring(idx + 1);
        return city + "#" + "[" + position + "]" + "#" + cnt;
    }
}

Driver端:

在这里插入图片描述

Mapper端:

tp

Reducer端:

tp

  • 运行情况:

在这里插入图片描述

  • 结果:

在这里插入图片描述

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

1.8 统计二手房标签的各类比例

  • 分析目的:

占比分析同样是MapReduce统计分析的一大常用方式。

  • 代码:

Driver端:

public class TagRatioByCityDriver {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        args = new String[] {"datas/tb_house.txt", "MapReduce/out/TagRatioByCity" };
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf);
        job.setJarByClass(TagRatioByCityDriver.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        job.setMapperClass(TagRatioByCityMapper.class);
        job.setReducerClass(TagRatioByCityReducer.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        job.waitForCompletion(true);
    }
}

Mapper端:

public class TagRatioByCityMapper extends Mapper<Object, Text, Text, IntWritable> {
    private Text outk = new Text();
    private IntWritable outv = new IntWritable(1);
    @Override
    protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString();
        String[] data = line.split("\t");
        String city = data[1], tag = data[8];
        if ("".equals(tag))  tag = "未知标签";
        outk.set(city + "-" + tag);
        context.write(outk, outv);
    }
}

Reducer端:

public class TagRatioByCityReducer extends Reducer<Text, IntWritable, Text, Text> {
    private Text outv = new Text();
    private int sum = 0;
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        DecimalFormat df = new DecimalFormat("0.00");
        int cnt = 0;
        for (IntWritable value : values) {
            cnt += value.get();
        }
        String s = key.toString();
        String format = "";
        if (s.contains("上海")) {
            sum = 2995;
            format = df.format((double) cnt / sum * 100) + "%";
        } else if (s.contains("北京")) {
            sum = 2972;
            format = df.format((double) cnt / sum * 100) + "%";
        } else if (s.contains("广州")) {
            sum = 2699;
            format = df.format((double) cnt / sum * 100) + "%";
        } else {
            sum = 2982;
            format = df.format((double) cnt / sum * 100) + "%";
        }
        outv.set(format);
        context.write(key, outv);
    }
}
  • 运行情况:

在这里插入图片描述

  • 结果:

tp

2、数据及源代码

  • Github

  • Gitee

3、总结

MapReduce统计分析过程需要比较细心,「根据二手房信息发布时间排序统计」这个涉及到Java中日期类SimpleDateFormatDate的使用,需要慢慢调试得出结果;统计最值和占比的难度并不高,主要在于统计要计算的类别的数量和总数量,最后二者相处即可;二次排序和自定义类难度较高,但一步一步来还是可以实现的。

结束!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/109420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全网首发“Java面试考点大全”,20+互联网公司,应有尽有

受疫情影响&#xff0c;今年似乎给人感觉时间比往年还要流逝得更快。显然&#xff0c;春节一过&#xff0c;我们又将迎来面试旺季金三银四。对于程序员来说&#xff0c;秋招的失利更意味着在金三银四要打一场“硬战”&#xff0c;可又有多少人做好了面试的准备呢&#xff1f;对…

Fabric.js 监听元素相交(重叠)

本文简介 点赞 关注 收藏 学会了 fabric.js 提供了一个方法可以检查对象是否与另一个对象相交&#xff08;也可以叫元素是否重叠&#xff09;。 这个方法叫 intersectsWithObject()。 本文主要想提一下 fabric.js 存在这么一个方便的方法。 检测元素是否相交有什么用呢&am…

【UE4 第一人称射击游戏】04-血溅效果

素材资料地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1epyD62jpOZg-o4NjWEjiyg 密码&#xff1a;jlhr 效果&#xff1a; 步骤&#xff1a; 1.将图片素材导入UE4 2.创建一个控件蓝图&#xff0c;命名为“Damageeffect” 双击打开“Damageeffect”&#xff0…

【关于时间序列的ML】项目 6 :机器学习中使用 LSTM 的时间序列

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

现在转行学python,前景和优势有哪些?

正所谓“男怕入错行&#xff0c;女怕嫁错郎”&#xff0c;可想而知进入一个正确的行业有多重要。 IT行业的高薪吸引着越来越多转行“入坑”&#xff0c;python作为目前的大势&#xff0c;是很多人转行的首选。 为什么这么多的人都想转行学习python&#xff0c;python有哪些前…

【架构师(第四十九篇)】 服务端开发之认识 Docker-compose

Docker-compose 介绍 通过一个配置文件&#xff0c;可以让系统一键启动所有的运行环境&#xff0c;nodejs&#xff0c;mysql&#xff0c;redis&#xff0c;mongodb 等。 如果开发环境需要多个服务&#xff0c;就需要启动多个 Docker 容器。 要连通多个 Docker 容器&#xf…

转行程序员,如何挑选既高薪又适合的编程语言?

“你为什么要学这个编程语言&#xff1f;” 很多人面对这个问题时&#xff0c;都回答不上来&#xff0c;大部分都只是看到了表象&#xff0c;或是脑子一热&#xff0c;随意给自己选了一个。事实上自己对这个编程语言的特性和市场现状并不了解&#xff0c;甚至都不知道这个语言到…

关于为什么要做量化白皮书这件事

我们一直想着再为行业做点什么 是从什么时候开始 在心里埋下了种子呢 许是从有人说“高频量化不除&#xff0c;市场再无宁日”的时候 是从中国基金报房佩燕老师写“这锅我们不背“的时候 是从部分量化私募主动站出来说话的时候 现今的互联网时代信息太繁杂 有时可以不用太…

ETCD的创建

一&#xff1a; 好原文链接&#xff1a; 搭建高可用Kubernetes集群之etcd v3.4.13集群搭建(一&#xff09; - 人艰不拆_zmc - 博客园1. etcd 简介 coreos 开发的分布式服务系统&#xff0c;内部采用 raft 协议作为一致性算法。作为服务发现系统&#xff0c;有以下的特点&#x…

【Vue】源码—虚拟DOM和diff算法

1.理解虚拟DOM和diff算法 1.1什么是虚拟DOM&#xff1f; 从本质上来说&#xff0c;虚拟DOM是一个JavaScript对象&#xff0c;通过对象的方式来表示DOM结构。将页面状态抽象为JS对象的形式&#xff0c;配合不同的渲染工具&#xff0c;使跨平台渲染成为可能。虚拟DOM是DOM的抽象…

【Python百日进阶-数据分析】Day136 - plotly旭日图:px.sunburst()实例

文章目录四、实例4.1 带有 plotly.express 的旭日图4.1.1 基础旭日图4.1.2 带有 plotly.express 的矩形 DataFrame 的旭日形4.1.3 改变path顺序&#xff0c;从而改变父子关系4.1.4 在 px.sunburst 中具有连续颜色参数的矩形 DataFrame 的 Sunburst4.1.5 在 px.sunburst 中具有离…

20岁电竞选手自学编程转行程序员,轻松拿下大厂offer

话说 人与人之间的差距 貌似挺小的 毕竟 不管是大佬还是我们 都是两只眼睛、一个鼻子、一张嘴 不多不少 醒醒&#xff0c;别睡了 人和人的差距是很大的&#xff01; 同样身为互联网冲浪选手 别人干啥啥都行 你却只会在评论区扣“牛X” #01 在多数人的认知里 电竞选…

校园网上报修系统/宿舍报修系统的设计与实现

摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;校园网上报修系统当然也不能排除在外&#xff0c;从报修信息的统计和分析&#xff0c;在过程中会产生大量的、各种各样的数…

Java Number Math 类

一般地&#xff0c;当需要使用数字的时候&#xff0c;我们通常使用内置数据类型&#xff0c;如&#xff1a;byte、int、long、double 等。 实例 int a 5000; float b 13.65f; byte c 0x4a; 然而&#xff0c;在实际开发过程中&#xff0c;我们经常会遇到需要使用对象&…

Java -- OSS对象存储服务(Object Storage Service,简称 OSS)文件服务器

一个成熟的技术架构要有一定的分离性&#xff0c; 平台级的产品一般会这么分&#xff1a;应用服务器、数据库服务器、文件服务器。一般文件、数据库、应用服务器&#xff0c;都应该做逻辑和物理的分离。 以前我们想要做文件上传可能要自己去搭建一个专门的服务器&#xff0c;然…

【Oracle】Oracle学习笔记

【Oracle】Oracle学习笔记 目录【Oracle】Oracle学习笔记P1、Oracle数据库的安装和配置P2、Oracle数据库管理P3-0、初步SQLP3-1、基本SQL SELECT语句课程学习链接&#xff1a; 【尚硅谷】Oracle数据库全套教程&#xff0c;oracle从安装到实战应用 P1、Oracle数据库的安装和配置…

学python以后做什么工作

python是一门很好的编程语言&#xff0c;很多人都在学&#xff0c;那么学完python以后能做什么工作呢&#xff1f;下面小编给大家总结一下。 软件开发&#xff0c;用python做软件是很多人正在从事的工作&#xff0c;不管是B/S软件&#xff0c;还是C/S软件&#xff0c;都能做。…

【自动化测试入门基础知识】离月薪15k的自动化工程师又进了1步

一、首先&#xff0c;什么是自动化测试&#xff1f; 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c;在设计了测试用例并通过评审之后&#xff0c;由测试人员根据测试用例中描述的过程一步步执行测试&#xff0c;得到实际结果与期望结果的比较…

Idea 报Error:java:无效的源发行版13

今天运行远程克隆的项目&#xff0c;发现报错为Idea 报Error:java:无效的源发行版13。 主要的原因就是克隆的项目和自己idea的jdk版本不一致。 java无效的源发行版13一、查看jdk版本1、file--setting2、找到java compiler3、选择file---project structure4、选择1.8jdk和85、这…

day06-表单标签及属性

文章目录一、知识回顾&#xff1a;二、单元内容6.1 表单标签6.1.1 表单标签 生活中的表单&#xff1a;网页中的表单&#xff1a;程序员中的表单&#xff1a;运行结果&#xff1a;6.2 表单标签的输入标记6.2.1 表单的文本框和密码框输入标记及提示信息属性文本框 密码框6.2.2 表…