需求

两张表,一张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. ABAP DEMO ALV-监听数据修改

    *&---------------------------------------------------------------------* *& Report YDEMO_006 ...

  2. 看看该死的jquery.form.js的用法,不是个东西

    $("#btnReg").click(function () { var options = { //target: '#output', // 把服务器返回的内容放入id为out ...

  3. Python机器学习基础教程-第2章-监督学习之K近邻

    前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...

  4. HTTP权威指南-报文与状态码

    所有的报文都向下流动 报文流向 报文组成 HTTP方法 状态码 GET示例 HEAD示例 100~199 信息性状态码 200~299 成功状态码 300~399重定向状态码 400~499 客户端错 ...

  5. Linux查看库依赖方法

    1.查看依赖的库:objdump -x xxx.so | grep NEEDED 2.查看可执行程序依赖的库:objdump -x 可执行程序名 | grep NEEDED 3.查看缺少的库: ldd ...

  6. Apache Flink SQL

    本篇核心目标是让大家概要了解一个完整的 Apache Flink SQL Job 的组成部分,以及 Apache Flink SQL 所提供的核心算子的语义,最后会应用 TumbleWindow 编写 ...

  7. LeetCode 278. 第一个错误的版本(First Bad Version)

    278. 第一个错误的版本 LeetCode278. First Bad Version 题目描述 你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每 ...

  8. SVN增加访问用户

    1.在Linux中进入SVN配置文件目录. 2.authz是设置权限的,只读还是可读可写,passwd是增加访问用户的. vim passwd; vim authz;

  9. jar 常用操作

    查看 jar 包中的文件列表,并进行重定向 jar -tvf a.jar > a.txt 更新文件到 jar 中,目录需对应 jar -uf a.jar com/a.class a.class ...

  10. Java基础笔试练习(六)

    1.在Java中,一个类可同时定义许多同名的方法,这些方法的形式参数个数.类型或顺序各不相同,传回的值也可以不相同.这种面向对象程序的特性称为? A.隐藏 B.覆盖 C.重载 D.Java不支持此特性 ...