需求

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

建表

  1. CREATE TABLE `click` (
  2. `id` int(20) NOT NULL AUTO_INCREMENT,
  3. `ad_id` int(20) DEFAULT NULL, -- 广告ID
  4. `click_num` int(30) DEFAULT NULL, -- 某天的点击数量
  5. `day` date,
  6. PRIMARY KEY (`id`)
  7. );
  8.  
  9. CREATE TABLE `total_click` (
  10. `id` int(20) NOT NULL AUTO_INCREMENT,
  11. `ad_id` int(20) DEFAULT NULL, -- 广告ID
  12. `total_click_num` int(50) DEFAULT NULL, -- 总点击数量
  13. PRIMARY KEY (`id`)
  14. )

pom依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.apache.hadoop</groupId>
  4. <artifactId>hadoop-client</artifactId>
  5. <version>2.7.3</version>
  6. </dependency>
  7.  
  8. <dependency>
  9. <groupId>junit</groupId>
  10. <artifactId>junit</artifactId>
  11. <version>4.11</version>
  12. </dependency>
  13.  
  14. <dependency>
  15. <groupId>log4j</groupId>
  16. <artifactId>log4j</artifactId>
  17. <version>1.2.17</version>
  18. </dependency>
  19.  
  20. <dependency>
  21. <groupId>mysql</groupId>
  22. <artifactId>mysql-connector-java</artifactId>
  23. <version>5.1.45</version>
  24. </dependency>
  25. </dependencies>

代码

自定义类

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

  1. import org.apache.hadoop.io.Writable;
  2. import org.apache.hadoop.mapreduce.lib.db.DBWritable;
  3.  
  4. import java.io.DataInput;
  5. import java.io.DataOutput;
  6. import java.io.IOException;
  7. import java.sql.PreparedStatement;
  8. import java.sql.ResultSet;
  9. import java.sql.SQLException;
  10.  
  11. public class MyDBWritable implements DBWritable, Writable {
  12. private String ad_id;
  13. private int click_num;
  14. private int total_click_num;
  15.  
  16. public MyDBWritable(){
  17.  
  18. }
  19. public MyDBWritable(String name, int age) {
  20. this.ad_id = name;
  21. this.click_num = age;
  22. this.total_click_num = total_click_num;
  23. }
  24.  
  25. public void write(DataOutput out) throws IOException {
  26. out.writeUTF(ad_id);
  27. out.writeInt(click_num);
  28. out.writeInt(total_click_num);
  29. }
  30.  
  31. //写数据的过程
  32. public void write(PreparedStatement statement) throws SQLException {
  33. //要和SQL_Run类的DBOutputFormat.setOutput(job,"total_click","ad_id","total_click_num")语句里字段的顺序保持一致
  34. statement.setString(1,ad_id);
  35. statement.setInt(2, total_click_num);
  36. }
  37.  
  38. //读数据的过程
  39. public void readFields(ResultSet resultSet) throws SQLException {
  40. ad_id =resultSet.getString(1);
  41. click_num =resultSet.getInt(2);
  42. }
  43.  
  44. public void readFields(DataInput in) throws IOException {
  45. ad_id =in.readUTF();
  46. click_num =in.readInt();
  47. total_click_num =in.readInt();
  48. }
  49.  
  50. public String getAd_id() {
  51. return ad_id;
  52. }
  53.  
  54. public void setAd_id(String ad_id) {
  55. this.ad_id = ad_id;
  56. }
  57.  
  58. public int getClick_num() {
  59. return click_num;
  60. }
  61.  
  62. public void setClick_num(int click_num) {
  63. this.click_num = click_num;
  64. }
  65.  
  66. public int getTotal_click_num() {
  67. return total_click_num;
  68. }
  69.  
  70. public void setTotal_click_num(int total_click_num) {
  71. this.total_click_num = total_click_num;
  72. }
  73.  
  74. }

Map

  1. import org.apache.hadoop.io.IntWritable;
  2. import org.apache.hadoop.io.LongWritable;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapreduce.Mapper;
  5.  
  6. import java.io.IOException;
  7.  
  8. public class SQLMapper extends Mapper<LongWritable,MyDBWritable,Text,IntWritable> {
  9. @Override
  10. protected void map(LongWritable key, MyDBWritable value, Context context) throws IOException, InterruptedException {
  11. context.write(new Text(value.getAd_id()),new IntWritable(value.getClick_num()));
  12. }
  13.  
  14. }

Reduce

  1. import org.apache.hadoop.io.IntWritable;
  2. import org.apache.hadoop.io.NullWritable;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapreduce.Reducer;
  5.  
  6. import java.io.IOException;
  7.  
  8. public class SQLReducer extends Reducer<Text,IntWritable,MyDBWritable,NullWritable> {
  9. @Override
  10. protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
  11. int total = 0;
  12. for(IntWritable i :values) {
  13. total+= i.get();
  14. }
  15. MyDBWritable myDBWritable = new MyDBWritable();
  16. myDBWritable.setAd_id(key.toString());
  17. myDBWritable.setTotal_click_num(total);
  18. context.write(myDBWritable,NullWritable.get());
  19. }
  20. }

App

  1. import org.apache.hadoop.conf.Configuration;
  2. import org.apache.hadoop.fs.FileSystem;
  3. import org.apache.hadoop.io.IntWritable;
  4. import org.apache.hadoop.io.NullWritable;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Job;
  7. import org.apache.hadoop.mapreduce.lib.db.DBConfiguration;
  8. import org.apache.hadoop.mapreduce.lib.db.DBInputFormat;
  9. import org.apache.hadoop.mapreduce.lib.db.DBOutputFormat;
  10.  
  11. public class SQL_Run {
  12. public static void main(String[] args) throws Exception {
  13.  
  14. Configuration conf=new Configuration();
  15.  
  16. //假如是本地测试,需要设置fs.defaultFS
  17. conf.set("fs.defaultFS","file:///");
  18.  
  19. Job job = Job.getInstance(conf);
  20.  
  21. FileSystem fs=FileSystem.get(conf);
  22.  
  23. job.setJobName("SQL_TEST");
  24. job.setJarByClass(SQL_Run.class);
  25. job.setMapperClass(SQLMapper.class);
  26. job.setReducerClass(SQLReducer.class);
  27.  
  28. //配置数据库信息
  29. String driveclass="com.mysql.jdbc.Driver";
  30. String url="jdbc:mysql://192.168.0.8:3306/bigdata";
  31. String username="root";
  32. String password="123456";
  33. DBConfiguration.configureDB(job.getConfiguration(),driveclass,url,username,password);
  34.  
  35. //设置数据库输入
  36. //需要通过总的记录数来计算切片
  37. DBInputFormat.setInput(job,MyDBWritable.class,"select ad_id,click_num from click","select count(id) from click");
  38.  
  39. //设置数据库输出 //total_click是表名,后面参数是字段值(可以多个)
  40. DBOutputFormat.setOutput(job,"total_click","ad_id","total_click_num");
  41.  
  42. job.setMapOutputKeyClass(Text.class);
  43. job.setMapOutputValueClass(IntWritable.class);
  44.  
  45. job.setOutputKeyClass(MyDBWritable.class);
  46. job.setOutputValueClass(NullWritable.class);
  47.  
  48. job.waitForCompletion(true);
  49. }
  50. }

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. LODOP设置打印份数及是否逐份输出

    LODOP中通过SET_PRINT_COPIES可以设置打印份数,例如:LODOP.SET_PRINT_COPIES(2);//指定份数为2份 如果一个任务里有多页,打印份数的时候,有两种输出方式,一 ...

  2. 【JQuery Zepto插件】图片预加载

    屏幕滚动到图片当前位置加载图片,把图片的真实地址写到data-src属性里即可. <img src="占位图" data-src="img/foot.jpg&quo ...

  3. 09点睛Spring MVC4.1-异步请求处理(包含兼容浏览器的服务器端推送)

    转发地址:https://www.iteye.com/blog/wiselyman-2215852 9.1 异步请求处理 Servlet 3开始支持异步请求处理 Spring MVC 3.2开始支持S ...

  4. Python unittest框架实现appium登录

    import unittest from appium.webdriver import webdriver from ddt import data,ddt,unpack class MyTestC ...

  5. Juniper总结

    Juniper的路由器分为两个部分——RE和PFE.不过貌似大部分路由器都分为这两个部分.... Routing Engine: 当密码授权通过之后,用户就进入了RoutingEngine中,在其中可 ...

  6. EM算法概念

    EM算法是一种非常经典的alternative optimizing算法.alternative optimizing的思想就是对于一个最优化问题,可以计算分为两步或者参数分为两个,就可以随机任意的选 ...

  7. 读取以key=value形式存储的txt文件

    代码片段(假设只有3个key=value): public static void main(String[] args) throws IOException { BufferedReader br ...

  8. AJAX-前后端交互的艺术

    AJAX-前后端交互的艺术 为什么要用AJAX? 当我们通过提交表单向服务器提交内容,或者进行一些其他操作,均涉及到了与浏览器之间的交互,传统的方式与AJAX方式的处理方法是不同的 传统方式:用户触发 ...

  9. [Xamarin] - "GenerateJavaStubs" 异常之解决

    背景 新建的 Xamarin 项目,编译失败. Error The "GenerateJavaStubs" task failed unexpectedly.Error The s ...

  10. Apache Shiro初认识

    Apache Shiro 一.Shiro介绍: Apache软件基金会专门针对系统中的登录.加密.权限认证.授权等等功能进行了封装,不仅仅适用于JavaWeb项目,CS架构的系统也可以使用Shiro. ...