mapreduce对于关系数据库的连接和访问

关系数据库的连接和访问

1.从数据库中输入数据

DBInputFormat提供从数据库读取数据的格式
DBRecordReader提供读取数据记录的接口
Hadoop允许直接从数据库读取数据,但是这样的话频繁读取会大大加重数据库的负载,所以一般不建议这样做
一个比较好的解决方法是:用数据库中的dump工具将待分析的大量数据输出为文本数据文件,并上载到HDFS中进行处理。

2.向数据库中输出计算结果
DBOutputFormat提供向数据库中输出数据的格式
DBRecordWriter提供向数据库中写入数据记录的接口
DBConfiguration提供数据库配置和创建连接的接口

DBConfiguration 中的静态方法:

 

public static void configureDB(Job job,String driverClass,String dbUrl,String userName,String password)

 DBOutputFormat 中提供静态方法(指定需要写入的数据表和字段):

 

 

public static void setOutput(Job job,String tableName,String ...fieldNames)

示例:

Configuration conf = new Configuration();
Job job = new Job(conf,JobClass.class);
job.setOutputFormat(DBOutputFormat.class);
DBConfiguration.configureDB(job,"com.mysql.jdbc.Driver","jdbc:mysql://db.host.com/mydb","myname","mypassword");
DBOutputFormat.setOutput(job,"Customers","Name","PhoneNumber");

 此外为了向数据库中写入数据还得实现DBWritable

package test;

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 org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapred.lib.db.DBWritable;

public class CustomersDBWritable implements Writable, DBWritable {
	private String CustomerName;
	private String PhoneNumber;

	@Override
	public void readFields(ResultSet resultSet) throws SQLException {
		CustomerName = resultSet.getString(1);
		PhoneNumber = resultSet.getString(2);
		// 除非是用DBInputFormat直接向数据库输入数据,否则readFields方法不会被调用
	}

	@Override
	public void write(PreparedStatement statement) throws SQLException {
		statement.setString(1, CustomerName);
		statement.setString(2, PhoneNumber);
	}

	@Override
	public void readFields(DataInput in) throws IOException {
		CustomerName = in.readUTF();
		PhoneNumber = in.readUTF();
	}

	@Override
	public void write(DataOutput out) throws IOException {
		out.writeUTF(CustomerName);
		out.writeUTF(PhoneNumber);
	}
}

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值