热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hadoop读写mysql数据库

需求描述我们有两张表“成绩表”和“总分表”,从成绩表中计算出每个学生的总成绩,记录到总分表中。表结构成绩表记录学生id,课程id,这科分数CREA

需求描述

我们有两张表“成绩表”和“总分表”,从成绩表中计算出每个学生的总成绩,记录到总分表中。


表结构


//成绩表记录学生id,课程id,这科分数
CREATE TABLE `score` (`id` int(11) NOT NULL AUTO_INCREMENT,`sid` int(11) DEFAULT NULL,`cid` int(11) DEFAULT NULL,`score` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
//总分表记录学生id和学生总成绩
CREATE TABLE `topscore` (`id` int(11) NOT NULL AUTO_INCREMENT,`sid` int(11) DEFAULT NULL,`totalscore` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

成绩如下:



自定义类实现序列化和DBWritable接口

实现序列化方法和数据库读写方法,这里我们读写是两张表。

import com.alibaba.fastjson.JSONObject;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapreduce.lib.db.DBWritable;import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class MysqlDb_scoreWritable implements Writable,DBWritable {private int id;private int sid;private int cid;private int score;private int totalscore;/***数据序列化*/public void write(DataOutput out) throws IOException {out.writeInt(id);out.writeInt(sid);out.writeInt(cid);out.writeInt(score);out.writeInt(totalscore);}public void readFields(DataInput in) throws IOException {this.id = in.readInt();this.sid = in.readInt();this.cid = in.readInt();this.score = in.readInt();this.totalscore = in.readInt();}/*** 数据库读写* 向topscore中写入值*/public void write(PreparedStatement statement) throws SQLException {statement.setInt(1,sid);statement.setInt(2,totalscore);}//从score中读取成绩public void readFields(ResultSet resultSet) throws SQLException {id = resultSet.getInt(1);sid = resultSet.getInt(2);cid = resultSet.getInt(3);score = resultSet.getInt(4);}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getSid() {return sid;}public void setSid(int sid) {this.sid = sid;}public int getCid() {return cid;}public void setCid(int cid) {this.cid = cid;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public int getTotalscore() {return totalscore;}public void setTotalscore(int totalscore) {this.totalscore = totalscore;}@Overridepublic String toString() {JSONObject json = new JSONObject();json.put("id",id);json.put("sid",sid);json.put("cid",cid);json.put("score",score);return json.toString();}
}

mapper类

map方法读取mysql表中一行行的数据,map的输入key,value分别是longWritable,上面我们自定义的mysql读写实体类。输入key是学生的id,value是自定义实体类。reduce的时候我们取出学生的各科成绩相加求总成绩。

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class MysqlDbMapper extends Mapper {protected void map(LongWritable key, MysqlDb_scoreWritable value, Context context) throws IOException, InterruptedException {System.out.println(value.toString());int sid = value.getSid();context.write(new IntWritable(sid),value);}
}

reducer类

reduce的时候我们取出学生的各科成绩相加求总成绩。输出key是我们自定义实体类向mysql表中写数据,value为空。

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;public class MysqlDbReducer extends Reducer {protected void reduce(IntWritable key, Iterable values, Context context) throws IOException, InterruptedException {int totalScore = 0;for(MysqlDb_scoreWritable m : values){totalScore += m.getScore();}MysqlDb_scoreWritable score = new MysqlDb_scoreWritable();score.setSid(key.get());score.setTotalscore(totalScore);context.write(score,NullWritable.get());}
}

运行app类

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.db.DBConfiguration;
import org.apache.hadoop.mapreduce.lib.db.DBInputFormat;
import org.apache.hadoop.mapreduce.lib.db.DBOutputFormat;public class DbApp {public static void main(String[] args) throws Exception{Configuration cOnf= new Configuration();Job job = Job.getInstance(conf);job.setJarByClass(DbApp.class);job.setJobName("mysql read write");job.setMapperClass(MysqlDbMapper.class);job.setReducerClass(MysqlDbReducer.class);job.setMapOutputKeyClass(IntWritable.class);job.setMapOutputValueClass(MysqlDb_scoreWritable.class);job.setOutputKeyClass(MysqlDb_scoreWritable.class);job.setOutputValueClass(NullWritable.class);//配置数据库信息String driverclass = "com.mysql.jdbc.Driver";String url = "jdbc:mysql://192.168.1.215:3306/school";String username = "root";String passwd = "root";DBConfiguration.configureDB(job.getConfiguration(),driverclass,url,username,passwd);//设置输入内容DBInputFormat.setInput(job,MysqlDb_scoreWritable.class,"select * from score","select count(id) from score");//设置输出内容,第一个string是表名,后面可以跟多个string是表字段名DBOutputFormat.setOutput(job,"topscore","sid","totalscore");job.waitForCompletion(true);}
}



推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • importjava.util.ArrayList;publicclassPageIndex{privateintpageSize;每页要显示的行privateintpageNum ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 标题: ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
幸福璞子难_197
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有