大数据-MapReduce-关于Json数据格式的数据的处理与练习

2023-12-16 23:30:19

目录

🐶16.1 Json是什么?

🐶16.2 Json的语法规则

🐶16.3 JSON 和 XML

🐶16.4 java中关于json中的jar包

🥙GSON:由谷歌进行开发

🥙Fastjson: 由阿里进行开发

🐶16.5 JsonObject讲解

🥙1.介绍

🥙2. 依赖

🥙3. 方法

🥙4. 实例-将json数据转换成java对象

🐶16.6 json在MapReduce中的引用


🐶16.1 Json是什么?

  • JSON,全称是 JavaScript Object Notation,即 JavaScript对象标记法。

  • JSON无论对于人,还是对于机器来说,都是十分便于阅读和书写的,而且相比 XML(另一种常见的数据交换格式),文件更小,因此迅速成为网络上十分流行的交换格式。

🐶16.2 Json的语法规则

JSON 的语法规则十分简单,可称得上“优雅完美”,总结起来有:

  • 数组(Array)用方括号(“[]”)表示。

  • 对象(0bject)用大括号(“{}”)表示。

  • 名称/值对(name/value)组合成数组和对象。

  • 名称(name)置于双引号中,值(value)有字符串、数值、布尔值、null、对象和数组。

  • 并列的数据之间用逗号(“,”)分隔

🐶16.3 JSON 和 XML

JSON常被拿来与XML做比较,因为JSON 的诞生本来就多多少少要有取代XNL的意思。

相比 XML,JSON的优势如下:

  1. 没有结束标签,长度更短,读写更快

  2. 能够直接被JavaScript解释器解析

  3. 可以使用数组

两者比较

  • JSON:

{
        "name":"兮动人",
        "age":22,
        "fruits":["apple","pear","grape"]
}
  • XML:

<root>
        <name>兮动人</name>
        <age>22</age>
        <fruits>apple</fruits>
        <fruits>pear</fruits>
        <fruits>grape</fruits>
</root>

🐶16.4 java中关于json中的jar包

  • 🥙GSON:由谷歌进行开发

下载地址:https://blog.csdn.net/u011403174/article/details/89491448

下载地址:https://github.com/alibaba/fastjson

🐶16.5 JsonObject讲解

🥙1.介绍

1)JSONObject只是一种数据结构,可以理解为JSON格式的数据结构(key-value 结构),可以使用put方法给json对象添加元素。JSONObject可以很方便的转换成字符串,也可以很方便的把其他对象转换成JSONObject对象。

2)JSON(JavaScript Object Notation的首字母缩写)是一种轻量级数据交换格式,最常用于客户端 - 服务器通信。它既易于读/写,又与语言无关。JSON值可以是另一个JSON 对象,数组,数字,字符串,布尔值(true / false)或null。也是后端开发中经常要接触的一个一个类,将要数据封装成json然后传递给前端。

🥙2. 依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.46</version>
</dependency>

?

🥙3. 方法

  • toJSONString(Object)【将指定的对象序列化成Json表示形式】

  • parseObject(String, Class)【将json反序列化为指定的Class模式】

🥙4. 实例-将json数据转换成java对象

这里有一个movie.txt的json文件,数据

package hadoop;

import com.alibaba.fastjson.JSONObject;
import com.doit.day03.Student;

import java.io.*;

public class JsonDemo {
    public static void main(String[] args) throws IOException {

        BufferedReader file=new BufferedReader(new FileReader("C:\\Users\\35014\\Desktop\\大数据\\test_file\\movie.txt"));

        String line=null;

        while ((line=file.readLine())!=null){
            //将json反序列化为Movie模式
            Movie movie = JSONObject.parseObject(line, Movie.class);
            System.out.println(movie);
            
            //将Movie模式序列化为Json表示形式
            String s = JSONObject.toJSONString(movie);
            System.out.println(s);
        }

        file.close();

    }
}

?

🐶16.6 json在MapReduce中的引用

获取每部电影的平均分

package com.doit.day03;

import com.alibaba.fastjson.JSONObject;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

// 每部电影的平均评分
public class MovieDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
// 创建配置文件对象
        Configuration conf = new Configuration();

        // 创建任务对象
        Job job = Job.getInstance(conf, "movie_rate");


        // 设置job任务中的map任务的任务类
        job.setMapperClass(MovieMapper.class);

        // 设置job任务中的reduce任务的任务类
        job.setReducerClass(MovieReducer.class);


        // 设置map端的输出的结果数据的类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(DoubleWritable.class);

        // 设置reduce端的输出的结果数据的类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(DoubleWritable.class);


        // 设置任务读取的文件的地址
        FileInputFormat.setInputPaths(job, new Path("D:\\hdp_data\\movie"));

        // 设置任务输出的结果文件的地址
        FileOutputFormat.setOutputPath(job, new Path("D:\\hdp_data\\movie_value"));

        // 将任务做提交操作
        job.waitForCompletion(true);

    }

    static class MovieMapper extends Mapper<LongWritable, Text, Text, DoubleWritable> {
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            String str = value.toString();

            Movie mv = JSONObject.parseObject(str, Movie.class);

            String movie = mv.getMovie();
            String rate = mv.getRate();

            System.out.println("movie:"+movie+"rate:"+rate);
            context.write(new Text(movie), new DoubleWritable(Double.parseDouble(rate)));

        }
    }

    static class MovieReducer extends Reducer<Text, DoubleWritable, Text, DoubleWritable> {
        @Override
        protected void reduce(Text key, Iterable<DoubleWritable> values, Context context) throws IOException, InterruptedException {
            int count = 0;
            int sum = 0;

            for (DoubleWritable value : values) {
                sum += value.get();
                count++;
            }

            double avg = sum / count;

            context.write(key, new DoubleWritable(avg));
        }
    }
}

文章来源:https://blog.csdn.net/weixin_40968325/article/details/135039345
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。