Hadoop读写mysql
需求
两张表,一张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的更多相关文章
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- 一步一步跟我学习hadoop(7)----hadoop连接mysql数据库运行数据读写数据库操作
为了方便 MapReduce 直接訪问关系型数据库(Mysql,Oracle).Hadoop提供了DBInputFormat和DBOutputFormat两个类.通过DBInputFormat ...
- shell中读写mysql数据库
本文介绍了如何在shell中读写mysql数据库.主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为 ...
- 本地通过Eclipse链接Hadoop操作Mysql数据库问题小结
前一段时间,在上一篇博文中描述了自己抽时间在构建的完全分布式Hadoop环境过程中遇到的一些问题以及构建成功后,通过Eclipse操作HDFS的时候遇到的一些问题,最近又想进一步学习学习Hadoop操 ...
- R语言使用RMySQL连接及读写Mysql数据库 测试通过
R语言使用RMySQL连接及读写Mysql数据库 简单说下安装过程,一般不会有问题,重点是RMySQL的使用方式. 系统环境说明 Redhat系统:Linux 460-42.6.32-431.29.2 ...
- JDBC读写MySQL的大字段数据
JDBC读写MySQL的大字段数据 不管你是新手还是老手,大字段数据的操作常常令你感到很头痛.因为大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式 来处理的.而非一般的字段 ...
- spark读写mysql
spark读写mysql除官网例子外还要指定驱动名称 travels.write .mode(SaveMode.Overwrite) .format("jdbc") .option ...
- mac安装Hadoop,mysql,hive,sqoop教程
在安装Hadoop,mysql,hive之前,首先要保证电脑上安装了jdk 一.配置jdk 1. 下载jdk http://www.oracle.com/technetwork/java/javase ...
- 五.hadoop 从mysql中读取数据写到hdfs
目录: 目录见文章1 本文是基于windows下来操作,linux下,mysql-connector-java-5.1.46.jar包的放置有讲究. mr程序 import java.io.DataI ...
随机推荐
- LODOP设置打印份数及是否逐份输出
LODOP中通过SET_PRINT_COPIES可以设置打印份数,例如:LODOP.SET_PRINT_COPIES(2);//指定份数为2份 如果一个任务里有多页,打印份数的时候,有两种输出方式,一 ...
- 【JQuery Zepto插件】图片预加载
屏幕滚动到图片当前位置加载图片,把图片的真实地址写到data-src属性里即可. <img src="占位图" data-src="img/foot.jpg&quo ...
- 09点睛Spring MVC4.1-异步请求处理(包含兼容浏览器的服务器端推送)
转发地址:https://www.iteye.com/blog/wiselyman-2215852 9.1 异步请求处理 Servlet 3开始支持异步请求处理 Spring MVC 3.2开始支持S ...
- Python unittest框架实现appium登录
import unittest from appium.webdriver import webdriver from ddt import data,ddt,unpack class MyTestC ...
- Juniper总结
Juniper的路由器分为两个部分——RE和PFE.不过貌似大部分路由器都分为这两个部分.... Routing Engine: 当密码授权通过之后,用户就进入了RoutingEngine中,在其中可 ...
- EM算法概念
EM算法是一种非常经典的alternative optimizing算法.alternative optimizing的思想就是对于一个最优化问题,可以计算分为两步或者参数分为两个,就可以随机任意的选 ...
- 读取以key=value形式存储的txt文件
代码片段(假设只有3个key=value): public static void main(String[] args) throws IOException { BufferedReader br ...
- AJAX-前后端交互的艺术
AJAX-前后端交互的艺术 为什么要用AJAX? 当我们通过提交表单向服务器提交内容,或者进行一些其他操作,均涉及到了与浏览器之间的交互,传统的方式与AJAX方式的处理方法是不同的 传统方式:用户触发 ...
- [Xamarin] - "GenerateJavaStubs" 异常之解决
背景 新建的 Xamarin 项目,编译失败. Error The "GenerateJavaStubs" task failed unexpectedly.Error The s ...
- Apache Shiro初认识
Apache Shiro 一.Shiro介绍: Apache软件基金会专门针对系统中的登录.加密.权限认证.授权等等功能进行了封装,不仅仅适用于JavaWeb项目,CS架构的系统也可以使用Shiro. ...