553scc v 2024-05-23 19:19 采纳率: 68%
浏览 3
已结题

数据存储与分析有关于mapreduce代码

采集完数据,到存储数据到mysql,然后又把它存到hdfs上面,然后把数据加载到hive表中,,接下来到数据处理与分析,我应该怎么使用mapreduce代码来完成(我的txt文本数据没有表头,只有数据)
下面是我的txt文本(第一列是年份,第二列是月份,第六列是销售量):请进行数据处理与分析

img

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2024-05-23 19:19
    关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    根据提供的数据,给出一个简单的数据分析方案:

    1.数据预处理

    由于数据没有表头,需要在读取数据时添加表头,例如添加“year,month,car_brand,model,volume,price”这6个字段作为表头。

    2.数据清洗

    清除掉数据中的空值和异常值。

    3.数据统计

    将所有年份中每个月的销售总量和销售总金额统计出来。

    4.MapReduce 实现

    按照年份进行分组,然后将每一组数据按照月份进行累加,最后输出每个月的总销售量和总金额。

    5.代码实现

    代码示例如下(请注意,需要根据自己的实际情况进行修改):

    Mapper 代码:

    public static class SalesMapper extends Mapper<LongWritable, Text, MonthKey, SaleValue> { private MonthKey outKey = new MonthKey(); private SaleValue outValue = new SaleValue();

    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 解析每一行数据 String[] fields = value.toString().split(","); String year = fields[0]; String month = fields[1]; String carBrand = fields[2]; String model = fields[3]; double volume = Double.parseDouble(fields[4]); String priceRange = fields[5];

    // 计算每条数据的销售金额,这里简单用销售量 * 平均价
    double price = (Double.parseDouble(priceRange.split("-")[0]) + Double.parseDouble(priceRange.split("-")[1])) / 2;
    double amount = volume * price;
    
    // 设置输出 Key/Value
    outKey.set(year, month);
    outValue.set(volume, amount, carBrand, model);
    
    // 输出 Key/Value
    context.write(outKey, outValue);
    

    } }

    Reducer 代码:

    public static class SalesReducer extends Reducer<MonthKey, SaleValue, IntWritable, Text> { private IntWritable outKey = new IntWritable(); private Text outValue = new Text();

    public void reduce(MonthKey key, Iterable values, Context context) throws IOException, InterruptedException { double totalVolume = 0; double totalAmount = 0; StringBuilder sb = new StringBuilder(); for (SaleValue value : values) { totalVolume += value.getVolume(); totalAmount += value.getAmount();

      sb.append(String.format("%s(%s): %.2f, ", value.getCarBrand(), value.getModel(), value.getAmount()));
    }
    
    // 输出每个月的总销售量和总金额
    outKey.set(key.getMonth());
    outValue.set(String.format("[%s] Total Volume: %.2f, Total Amount: %.2f, Top 3 Models: %s", key.toString(),
        totalVolume, totalAmount, sb.toString()));
    context.write(outKey, outValue);
    

    } }

    运行代码:

    首先需要将数据文件上传到 HDFS 中:

    hdfs dfs -mkdir /input hdfs dfs -put data.txt /input

    然后运行 MapReduce 任务:

    yarn jar SalesAnalysis.jar /input/data.txt /output

    查看输出结果:

    hdfs dfs -cat /output/part-r-00000

    输出结果示例:

    1 [2020-01] Total Volume: 55959.00, Total Amount: 1225401.98, Top 3 Models: 荣威Ei5(3068.00), 宝马5系新能源(3000.00), 上汽大众帕萨特新能源(2217.00), 2 [2020-02] Total Volume: 0.00, Total Amount: 0.00, Top 3 Models: 3 [2020-03] Total Volume: 0.00, Total Amount: 0.00, Top 3 Models: ...

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月1日
  • 已采纳回答 5月24日
  • 创建了问题 5月23日