1、首先,自定义对象,该对象需要实现序列化功能才可以在网络上运行,实现序列化功能需要继承 java.io.Serializable 这个接口,
这个接口定义了空方法,不需要实现任何功能,表示具有序列化功能的一个空接口
不过需要定义一个序列号,例如如下:
private static final long serialVersionUID = 1L;
然而,hadoop中关于序列化对象的方法有一个需要实现readFields(ResultSet resultSet)和write(PreparedStatement preparedStatement)的
接口DBWritable,实现了该接口的对象方可在reducer和mapper中进行对象的存储。
例如:
@Override
public void write(PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setString(1, time);
preparedStatement.setInt(2, sum);
preparedStatement.setInt(3, workSum);
preparedStatement.setDouble(4, rate);
}
@Override
public void readFields(ResultSet resultSet) throws SQLException {
resultSet.getString(1);
resultSet.getInt(2);
resultSet.getInt(3);
resultSet.getDouble(4);
}
2、定义输出类型为实现了序列化的类型
3、配置Job的输出类型
先建立连接,配置数据库的驱动位置
配置数据库的url位置
配置数据库的账户和密码
config.set(DBConfiguration.DRIVER_CLASS_PROPERTY,"com.mysql.jdbc.Driver");
config.set(DBConfiguration.URL_PROPERTY,"jdbc:mysql://localhost:3306/test");
config.set(DBConfiguration.USERNAME_PROPERTY, "root");
config.set(DBConfiguration.PASSWORD_PROPERTY, "111111");
配置输出的数据表以及其中的内容,如下格式:
DBOutputFormat.setOutput(job_name, table_name, attribute_name1, attribute_name2, attribute_name3....);
如下例子:
DBOutputFormat.setOutput(job, "t_car", "time", "sum", "work_sum", "rate");