将MapReduce的结果输出至Mysql数据库
package com.sun.mysql;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.db.DBConfiguration;
import org.apache.hadoop.mapreduce.lib.db.DBOutputFormat;
import org.apache.hadoop.mapreduce.lib.db.DBWritable;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
/**
* 将mapreduce的结果数据写入mysql中
* @author asheng
*/
public class WriteDataToMysql {
/**
* 重写DBWritable
* @author asheng
* TblsWritable需要向mysql中写入数据
*/
public static class TblsWritable implements Writable, DBWritable
{
String tbl_name;
String tbl_type;
public TblsWritable()
{
}
public TblsWritable(String tbl_name,String tab_type)
{
this.tbl_name = tbl_name;
this.tbl_type = tab_type;
}
@Override
public void write(PreparedStatement statement) throws SQLException
{
statement.setString(1, this.tbl_name);
statement.setString(2, this.tbl_type);
}
@Override
public void readFields(ResultSet resultSet) throws SQLException
{
this.tbl_name = resultSet.getString(1);
this.tbl_type = resultSet.getString(2);
}
@Override
public void write(DataOutput out) throws IOException
{
out.writeUTF(this.tbl_name);
out.writeUTF(this.tbl_type);
}
@Override
public void readFields(DataInput in) throws IOException
{
this.tbl_name = in.readUTF();
this.tbl_type = in.readUTF();
}
public String toString()
{
return new String(this.tbl_name + " " + this.tbl_type);
}
}
public static class ConnMysqlMapper extends Mapper<LongWritable,Text,Text,Text>
//TblsRecord是自定义的类型,也就是上面重写的DBWritable类
{
public void map(LongWritable key,Text value,Context context)throws IOException,InterruptedException
{
//<首字母偏移量,该行内容>接收进来,然后处理value,将abc和x作为map的输出
//key对于本程序没有太大的意义,没有使用
String name = value.toString().split(" ")[0];
String type = value.toString().split(" ")[1];
context.write(new Text(name),new Text(type));
}
}
public static class ConnMysqlReducer extends Reducer<Text,Text,TblsWritable,TblsWritable>
{
public void reduce(Text key,Iterable<Text> values,Context context)throws IOException,
InterruptedException
{
//接收到的key value对即为要输入数据库的字段,所以在reduce中:
//wirte的第一个参数,类型是自定义类型TblsWritable,利用key和value将其组合成TblsWritable,
然后等待写入数据库
//wirte的第二个参数,wirte的第一个参数已经涵盖了要输出的类型,所以第二个类型没有用,设为null
for(Iterator<Text> itr = values.iterator();itr.hasNext();)
{
context.write(new TblsWritable(key.toString(),itr.next().toString()),null);
}
}
}
public static void main(String args[]) throws IOException, InterruptedException, ClassNotFoundException
{
Configuration conf = new Configuration();
DBConfiguration.configureDB(conf, "com.mysql.jdbc.Driver","jdbc:mysql://127.0.0.1:3306/mapreduce_test","root", "root");
Job job = new Job(conf,"test mysql connection");
job.setJarByClass(ReadDataFromMysql.class);
job.setMapperClass(ConnMysqlMapper.class);
job.setReducerClass(ConnMysqlReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(DBOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
DBOutputFormat.setOutput(job, "lxw_tabls", "TBL_NAME","TBL_TYPE");
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
//执行输入参数为/home/asheng/hadoop/in/test3.txt
//test3.txt中的内容为
/*
abc x
def y
chd z
*/
//即将abc x分别做为TBL_NAME,和TBL_TYPE插入数据库中
//输出结果在mysql数据库中查看
//select * from lxw_tabls;
//发现新增三行
/*
abc x
def y
chd z
*/
将MapReduce的结果输出至Mysql数据库的更多相关文章
- MapReduce 程序mysql JDBC驱动类找不到原因及学习hadoop写入数据到Mysql数据库的方法
报错 :ClassNotFoundException: com.mysql.jdbc.Driver 需求描述: hadoop需要动态加载个三方jar包(比如mysql JDBC 驱动包),是在MR结束 ...
- vc6.0运用mysql数据库中的编码所导致的乱码问题(接收和输出的编码必须要一致)
[编译中遇见的问题] ①在用vc 6.0去调用MySQL中的数据时,出现中文乱码 ②不明白mysql中的码制 [开始解决问题] ①打开mysql控制台 ...
- 一个漂亮的输出MySql数据库表结构的PHP页面
经常为了方便和直观,我们会首先直接在数据库中设计出表,但是接下来又要将表的结构和设计编写在设计文档中,以便编码的时候可以直观的查询,一旦数据库表非常多,字段非常多的时候,这无疑是件非常郁闷的工作. 这 ...
- .net core 中使用Log4net输出日志到Mysql数据库中
.net core 中使用Log4net输出日志到数据库中去 1.使用Nuget安装log4net 和 mysql.data 2.设置log4net 的配置文件 log4net.config 可以设置 ...
- php测试mysql数据库连通性并且在浏览器每一秒输出一次结果
有时候网络环境不稳定,需要测试mysql数据库的连接是否畅通,我们可以通过php脚本实现,具体代码如下,在360浏览器测试通过: <?php /* 循环打印出mysql连接测试 */ heade ...
- 本地通过Eclipse链接Hadoop操作Mysql数据库问题小结
前一段时间,在上一篇博文中描述了自己抽时间在构建的完全分布式Hadoop环境过程中遇到的一些问题以及构建成功后,通过Eclipse操作HDFS的时候遇到的一些问题,最近又想进一步学习学习Hadoop操 ...
- 一个小时学会 MySQL 数据库
随着移动互联网的结束与人工智能的到来大数据变成越来越重要,下一个成功者应该是拥有海量数据的,数据与数据库你应该知道. 一.数据库概要 数据库(Database)是存储与管理数据的软件系统,就像一个存入 ...
- 一步一步跟我学习hadoop(7)----hadoop连接mysql数据库运行数据读写数据库操作
为了方便 MapReduce 直接訪问关系型数据库(Mysql,Oracle).Hadoop提供了DBInputFormat和DBOutputFormat两个类.通过DBInputFormat ...
- MySQL数据库和InnoDB存储引擎文件
参数文件 当MySQL示例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等.在默认情况下,MySQL实例会按照一定 ...
随机推荐
- java课后作业7
9.页实验 下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么? m=d; d=m; d=(Dog)m; d=c; c=(Cat)m; 答: d=m;和d=c;引起编译错误: 原因: ...
- [Android Pro] Normal Permissions
As of API level 23, the following permissions are classified as PROTECTION_NORMAL: ACCESS_LOCATION_E ...
- September 25th 2016 Week 40th Sunday
Everything is good in its season. 万物逢时皆美好. Don't lose hope. Remeber that even a dog has its day. Onc ...
- osgi学习
Bundle可以被动态地安装.启动.停止和卸载.Bundle是服务(Service)和组件(Component)的载体.在OSGi中,每个Bundle都有自己独立于其他Bundle的ClassLoad ...
- 10.11 cocoapods安装
手动安装gem 手动下载 rubygem https://rubygems.org/pages/download#formats 10.11 cocoapods安装 sudo gem install ...
- nyoj998(euler)
题意:题意:给出n和m,求满足条件gcd(x, n)>=m的x的gcd(x, n)的和,其中1<=x<=n,1<= n, m <= 1e9:思路:此题和nyoj1007差 ...
- 二、JavaScript语言--JS实践--信息滚动效果制作
运用JavaScript技术,掌握无缝滚动和歇间性滚动的制作方法. 一.marquee标签实现信息滚动 1 behavior滚动的方式 alternate:表示在两端之间来回滚动 scroll:表示由 ...
- PHP魔术方法在框架中的应用
class usermodel{ protected $email='user@163.com'; protected $data=array(); public function __set($k, ...
- LoadRunner函数
一.基础函数简介 在VU左边导航栏中,有三个LoadRunner框架函数,分别是vuser_init().Action().vuser_end().这三个函数存在于任何Vuser类型的脚本中. vus ...
- rpm -qc 来查找安装包的配置文件
rpm -qc elasticsearch /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/jvm.options /etc/elast ...