需求

两张表,一张click表记录某广告某一天的点击量,另一张total_click表记录某广告的总点击量

建表

CREATE TABLE `click` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`ad_id` int(20) DEFAULT NULL, -- 广告ID
`click_num` int(30) DEFAULT NULL, -- 某天的点击数量
`day` date,
PRIMARY KEY (`id`)
); CREATE TABLE `total_click` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`ad_id` int(20) DEFAULT NULL, -- 广告ID
`total_click_num` int(50) DEFAULT NULL, -- 总点击数量
PRIMARY KEY (`id`)
)

pom依赖

<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.3</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency> <dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
</dependencies>

代码

自定义类

Writable是为了与MapReduce进行对接,而DBWritable是为了与MySQL进行对接。

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 MyDBWritable implements DBWritable, Writable {
private String ad_id;
private int click_num;
private int total_click_num; public MyDBWritable(){ }
public MyDBWritable(String name, int age) {
this.ad_id = name;
this.click_num = age;
this.total_click_num = total_click_num;
} public void write(DataOutput out) throws IOException {
out.writeUTF(ad_id);
out.writeInt(click_num);
out.writeInt(total_click_num);
} //写数据的过程
public void write(PreparedStatement statement) throws SQLException {
//要和SQL_Run类的DBOutputFormat.setOutput(job,"total_click","ad_id","total_click_num")语句里字段的顺序保持一致
statement.setString(1,ad_id);
statement.setInt(2, total_click_num);
} //读数据的过程
public void readFields(ResultSet resultSet) throws SQLException {
ad_id =resultSet.getString(1);
click_num =resultSet.getInt(2);
} public void readFields(DataInput in) throws IOException {
ad_id =in.readUTF();
click_num =in.readInt();
total_click_num =in.readInt();
} public String getAd_id() {
return ad_id;
} public void setAd_id(String ad_id) {
this.ad_id = ad_id;
} public int getClick_num() {
return click_num;
} public void setClick_num(int click_num) {
this.click_num = click_num;
} public int getTotal_click_num() {
return total_click_num;
} public void setTotal_click_num(int total_click_num) {
this.total_click_num = total_click_num;
} }

Map

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; public class SQLMapper extends Mapper<LongWritable,MyDBWritable,Text,IntWritable> {
@Override
protected void map(LongWritable key, MyDBWritable value, Context context) throws IOException, InterruptedException {
context.write(new Text(value.getAd_id()),new IntWritable(value.getClick_num()));
} }

Reduce

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; public class SQLReducer extends Reducer<Text,IntWritable,MyDBWritable,NullWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int total = 0;
for(IntWritable i :values) {
total+= i.get();
}
MyDBWritable myDBWritable = new MyDBWritable();
myDBWritable.setAd_id(key.toString());
myDBWritable.setTotal_click_num(total);
context.write(myDBWritable,NullWritable.get());
}
}

App

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
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 SQL_Run {
public static void main(String[] args) throws Exception { Configuration conf=new Configuration(); //假如是本地测试,需要设置fs.defaultFS
conf.set("fs.defaultFS","file:///"); Job job = Job.getInstance(conf); FileSystem fs=FileSystem.get(conf); job.setJobName("SQL_TEST");
job.setJarByClass(SQL_Run.class);
job.setMapperClass(SQLMapper.class);
job.setReducerClass(SQLReducer.class); //配置数据库信息
String driveclass="com.mysql.jdbc.Driver";
String url="jdbc:mysql://192.168.0.8:3306/bigdata";
String username="root";
String password="123456";
DBConfiguration.configureDB(job.getConfiguration(),driveclass,url,username,password); //设置数据库输入
//需要通过总的记录数来计算切片
DBInputFormat.setInput(job,MyDBWritable.class,"select ad_id,click_num from click","select count(id) from click"); //设置数据库输出 //total_click是表名,后面参数是字段值(可以多个)
DBOutputFormat.setOutput(job,"total_click","ad_id","total_click_num"); job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class); job.setOutputKeyClass(MyDBWritable.class);
job.setOutputValueClass(NullWritable.class); job.waitForCompletion(true);
}
}

Hadoop读写mysql的更多相关文章

  1. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. 一步一步跟我学习hadoop(7)----hadoop连接mysql数据库运行数据读写数据库操作

        为了方便 MapReduce 直接訪问关系型数据库(Mysql,Oracle).Hadoop提供了DBInputFormat和DBOutputFormat两个类.通过DBInputFormat ...

  3. shell中读写mysql数据库

    本文介绍了如何在shell中读写mysql数据库.主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为 ...

  4. 本地通过Eclipse链接Hadoop操作Mysql数据库问题小结

    前一段时间,在上一篇博文中描述了自己抽时间在构建的完全分布式Hadoop环境过程中遇到的一些问题以及构建成功后,通过Eclipse操作HDFS的时候遇到的一些问题,最近又想进一步学习学习Hadoop操 ...

  5. R语言使用RMySQL连接及读写Mysql数据库 测试通过

    R语言使用RMySQL连接及读写Mysql数据库 简单说下安装过程,一般不会有问题,重点是RMySQL的使用方式. 系统环境说明 Redhat系统:Linux 460-42.6.32-431.29.2 ...

  6. JDBC读写MySQL的大字段数据

    JDBC读写MySQL的大字段数据   不管你是新手还是老手,大字段数据的操作常常令你感到很头痛.因为大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式 来处理的.而非一般的字段 ...

  7. spark读写mysql

    spark读写mysql除官网例子外还要指定驱动名称 travels.write .mode(SaveMode.Overwrite) .format("jdbc") .option ...

  8. mac安装Hadoop,mysql,hive,sqoop教程

    在安装Hadoop,mysql,hive之前,首先要保证电脑上安装了jdk 一.配置jdk 1. 下载jdk http://www.oracle.com/technetwork/java/javase ...

  9. 五.hadoop 从mysql中读取数据写到hdfs

    目录: 目录见文章1 本文是基于windows下来操作,linux下,mysql-connector-java-5.1.46.jar包的放置有讲究. mr程序 import java.io.DataI ...

随机推荐

  1. Python使用numpy实现BP神经网络

    Python使用numpy实现BP神经网络 本文完全利用numpy实现一个简单的BP神经网络,由于是做regression而不是classification,因此在这里输出层选取的激励函数就是f(x) ...

  2. Redis的特性及运用

    Redis特性 一个产品的使用场景肯定是需要根据产品的特性,先列举一下Redis的特点: 读写性能优异 持久化 数据类型丰富 单线程 数据自动过期 发布订阅 分布式 这里我们通过几个场景,不同维度说下 ...

  3. iOS实现简单时钟效果

    实现的效果图如下 : 实现代码如下: #import "ViewController.h" //将旋转角度转换为弧度制#define angleToRadion(angle) (( ...

  4. LODOP插件的IE浏览器的安全设置

    LodopFuncs.js里的判断默认是混合部署,IE等支持np插件的浏览器会走lodop插件方式,但是IE的安全设置可能会阻挡lodop插件,可点击允许或修改IE浏览器的安全设置让Lodop每次都能 ...

  5. 最新 医渡云java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.医渡云等10家互联网公司的校招Offer,因为某些自身原因最终选择了医渡云.6.7月主要是做系统复习.项目复盘.LeetCo ...

  6. {"aa":null} 如何能转化为 {"aa":{}}

    一个同事问的一个功能需求:{"aa":null} 如何能转化为 {"aa":{}}因为需求暂时不明确,暂时先完成这样的转换.使用的是FastJson1.2.7 ...

  7. 兔子问题(Rabbit problem)

    Description 有一种兔子,出生后一个月就可以长大,然后再过一个月一对长大的兔子就可以生育一对小兔子且以后每个月都能生育一对.现在,我们有一对刚出生的这种兔子,那么,n 个月过后,我们会有多少 ...

  8. 021 Android 查询已经导入到工程中的数据库+抖动效果

    1.将数据库(.db)文件放入工程中 在project状态下,新建assets文件夹,并将数据库文件放入assets目录下. 注意:assets目录.java目录.res目录是同级的 new---&g ...

  9. 获取可视区域高度赋值给div(解决document.body.clientHeight的返回值为0的问题)

    设置html,body{height:100%} 在使用html5文档类型的时候, 设置了html body的高度100%之后,两个浏览器就都能获取document.body.clientHeight ...

  10. [转帖]使用Nginx转发TCP/UDP数据

    使用Nginx转发TCP/UDP数据 https://www.cnblogs.com/guigujun/p/8075620.html 编译安装Nginx 从1.9.0开始,nginx就支持对TCP的转 ...