zoukankan      html  css  js  c++  java
  • Hadoop DBOutputFormat的使用

    最近在研究数据在HDFS和关系型数据库之间的迁移,主要使用了两种方式:一是,按照数据库要求的文件格式生成文件,然后由数据库提供的导入工具进行导入;二是采用JDBC的方式进行导入。MapReduce默认提供了DBInputFormat和DBOutputFormat,分别用于数据库的读取和数据库的写入。为了使用DBOutputFormat我们需要完成以下工作。

    首先,对于每一个数据库表编写对应的bean类,该类需要实现WritableComparable接口和DBWritable接口(如果是DBInputFormat,则需要实现Writable和DBWritable。之所以是这样是因为DBOutputFormat在输出的时候是将key写入到数据库而不是value。根据Hadoop的规定Key需要能够进行比较排序,所以需要实现WritableComparable)。Bean类的实现以下面的代码为例:

     

      public void readFields(ResultSet result) throws SQLException {
      		int index = 1;
      		this.setTestId(result.getString(index++));
      		this.setTestName(result.getString(index++));
      		this.setAge(result.getInt(index++));
      	}
      	public void write(PreparedStatement statement) throws SQLException {
      		int index = 1;
      		statement.setString(index++, this.getTestId());
      		statement.setString(index++, this.getTestName());
      		statement.setInt(index, this.getAge());
      
      	}

    上面两个方法对应着DBWriteable接口。readFields方法负责从结果集中读取数据库数据(注意ResultSet的下标是从1开始的),一次读取查询SQL中筛选的某一列。Write方法负责将数据写入到数据库,将每一行的每一列依次写入。

    完成bean的定义后,进行Mapper的编写,主要是解析数据库的每一行数据然后将每一列赋值给bean对应的属性,这里不再做详细的介绍。

    最后进行Job的一些配置,具体如下面代码所示:

      Configuration conf = new Configuration();
      conf.set(DBConfiguration.DRIVER_CLASS_PROPERTY, 			                                                       "com.mysql.jdbc.Driver");
      conf.set(DBConfiguration.URL_PROPERTY,
      				"jdbc:mysql://localhost:3306/htestdb");
      conf.set(DBConfiguration.USERNAME_PROPERTY, "root");
      conf.set(DBConfiguration.PASSWORD_PROPERTY, "");
      job.setNumReduceTasks(0);
      DBOutputFormat.setOutput(job, "test", "testid","testname","age");
      job.setOutputFormatClass(DBOutputFormat.class);

    上面的配置主要包括以下几项:

    l 数据库驱动的名称:com.mysql.jdbc.Driver

    l 数据库URL:jdbc:mysql://localhost:3306/htestdb

    l 用户名:root

    l 密码:空

    l 数据库表以及每列的名称:DBOutputFormat.setOutput(job, "test", "testid","testname","age")

    除此之外还有Hadoop基础设置,比如reduce的个数、输入输出方式、输入输出路径等,这里不再做详细介绍。

    需要提醒的是DBOutputFormat以MapReduce的方式运行,会并行的连接数据库。在这里需要合适的设置map活着reduce的个数,以便将并行连接的数量控制在合理的范围之内。


  • 相关阅读:
    控件还是还原到客户端的好
    练习之彩票一 需求整理和分析
    Oracle 查询并删除重复记录的SQL语句
    C# 如何生成CHM帮助文件
    C#生成CHM帮助文件—>续
    datagridview中用Enter代替tab实现焦点切换,可换行
    博客园的dotaer
    winfrom中datagridview指定单元格为编辑状态
    C#生成CHM帮助文件(linq版)
    C语言03
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3371916.html
Copyright © 2011-2022 走看看