如何在MapReduce中临时连接MySQL

时间:2015-06-06 12:09:55

标签: hadoop mapreduce

我想暂时连接到MySQL中的MapReduce。换句话说,我想暂时将MySQL中的表带到Map函数来更改InputData(Text),但结果为空。

以下是我的代码:

public class Map extends Mapper{

private Text outputKey=new Text();

private final static IntWritable outputValue=new IntWritable(1);

public void map(LongWritable key,Text value,Context context)
throws IOException,InterruptedException
{
    int i=0;
    try{
        Connection con=DriverManager.getConnection("jdbc:sqlserver://locallhost:3306/test_db",
                "user","user");
        PreparedStatement ps=con.prepareStatement("select * from studentinfo");
        ResultSet rs=ps.executeQuery();
        while(rs.next())
            i++;

        AirlinePerformanceParser parser=new AirlinePerformanceParser(value);
        outputKey.set(parser.getMonth_day()+","+i);
        context.write(outputKey, outputValue);

    }catch(SQLException e)
    {
        e.printStackTrace();
    }
}
}

映射并减少工作(没有例外),但结果为空。

我不想使用DBInputFormatDBInputFormat不得使用MySQL表。

有什么问题?

1 个答案:

答案 0 :(得分:0)

如果你的查询是静态的,即它不依赖于地图输入(就像你当前的查询一样),你应该将你的sql代码移动到setup函数中,只查询你的数据库一次。

// set global the data buffer from your sql results (here a counter)
int nbResults;

@Override
protected void setup(Context context) throws IOException, InterruptedException {
    // query your DB
    Connection con [...]
 }

public void map(LongWritable key,Text value,Context context)throws IOException,InterruptedException {
    AirlinePerformanceParser parser=new AirlinePerformanceParser(value);
    outputKey.set(parser.getMonth_day()+","+nbResults);
    context.write(outputKey, outputValue);
}

正如@Ramzy指出的那样,检查连接状态。

此外,如果您需要的是SELECT *,请不要执行COUNT(*)