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

news/2024/7/9 4:58:11

目录

🐶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

  • 🥙Fastjson: 由阿里进行开发

下载地址: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));
        }
    }
}


http://lihuaxi.xjx100.cn/news/1897003.html

相关文章

【数据结构】双链表的定义和操作

目录 1.双链表的定义 2.双链表的创建和初始化 3.双链表的插入节点操作 4.双链表的删除节点操作 5.双链表的查找节点操作 6.双链表的更新节点操作 7.完整代码 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助…

C++之io学习

01.C类型转换(了解) 静态转换&#xff1a; 用于类层次结构中基类&#xff08;父类&#xff09;和派生类&#xff08;子类&#xff09;之间指针或引用的转换 用于基本数据类型之间的转换&#xff0c;如把int转换成char&#xff0c;把char转换成int。这种转换的安全性也要开发…

SpringMVC 返回 html 视图页面,SpringMVC与Servlet,Servlet重定向与转发

1. SpringMVC与Servlet的关系 SpringMVC框架是建立在Servlet之上的&#xff0c;提供各种功能&#xff0c;各种封装&#xff0c;各种方便的同时&#xff0c;它一点儿也没有限制Servlet&#xff0c;我们完全可以在SpringMVC的controller中&#xff0c;完全按照Servlet的方式来写…

线程间的通信

线程间的通信使单个独立的线程得到有效组织&#xff0c;提升了CPU利用率。 1、等待/通知机制 wait方法是使当前执行代码的线程进入等待状态&#xff0c;是Object类的方法&#xff0c;作用是将当前线程置入预执行队列并且在wait方法所在的代码行处停止执行&#xff0c;直至接到通…

《Linux C编程实战》笔记:一些系统调用

目录 dup和dup2函数 fcntl函数 示例程序1 示例程序2 ioctl函数 dup和dup2函数 #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd): dup 函数复制 oldfd 参数所指向的文件描述符。 参数&#xff1a; oldfd&#xff1a;要复制的文件描述符的…

selenium 与 chromedriver安装

本文章向大家介绍selenium 安装与 chromedriver安装&#xff0c;主要包括selenium 安装与 chromedriver安装使用实例、应用技巧、基本知识点总结和需要注意事项供大家参考。 一、安装selenium 1、Selenium简介 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开…

[Verilog] 设计方法和设计流程

主页&#xff1a; 元存储博客 文章目录 1. 设计方法2. 设计流程 3 Vivado软件设计流程总结 1. 设计方法 Verilog 的设计多采用自上而下的设计方法&#xff08;top-down&#xff09;。设计流程是指从一个项目开始从项目需求分析&#xff0c;架构设计&#xff0c;功能验证&#…

【Unity】简单实现生成式电子围栏

【Unity】简单实现生成式电子围栏 三维电子围栏是一种通过使用三维技术和电子设备来建立虚拟围栏&#xff0c;用于监控和控制特定区域的系统。它可以通过使用传感器和摄像头来检测任何越界行为&#xff0c;并及时发出警报。这种技术可以应用于安防领域以及其他需要对特定区域进…