我想暂时连接到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();
}
}
}
映射并减少工作(没有例外),但结果为空。
我不想使用DBInputFormat
。 DBInputFormat
不得使用MySQL表。
有什么问题?
答案 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(*)
。