大数据-MapReduce-关于Json数据格式的数据的处理与练习
目录
🐶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的优势如下:
-
没有结束标签,长度更短,读写更快
-
能够直接被JavaScript解释器解析
-
可以使用数组
两者比较
-
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));
}
}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!