代码地址 :
https://gitee.com/tanghongping/hadoopMapReduce/tree/master/src/com/thp/bigdata/myInputFormat
需求:
现有一些原始日志需要做增强解析处理,流程:
1、 从原始日志文件中读取数据
2、 根据日志中的一个URL字段到外部知识库中获取信息增强到原始日志
3、 如果成功增强,则输出到增强结果目录;如果增强失败,则抽取原始数据中URL字段输出到待爬清单目录
分析:
程序的关键点是要在一个mapreduce程序中根据数据的不同输出类型结果到不同的目录,这类灵活的输出需求可以通过自定义的OutputFormat来实现。
DBLoader : 连接数据库,从数据库中将字典数据缓存出来
package com.thp.bigdata.logEnhance;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* 数据库连接
* java.sql包中的接口,它是sun公司为了简化,统一对数据库的操作,定义了一套java操作数据库的规范,
* 由各个数据库公司自己实现,数据库有mysql oracle等,
* 而com.mysql.jdbc包中的类是mysql自己实现规范接口的类,
* 不同的数据库有不同的实现,为了能够只写一套代码,实现跨数据库使用,
* 书写传统jdbc需要导入的包就使用java.sql包,而不用考虑具体的实现类。
* @author 汤小萌
*
*/
public class DBLoader {
/**
* 从数据库中将url对应的内容全部放到HashMap中进行缓存
*/
public static void dbLoader(Map<String, String> urlContentMap) {
Connection con = null;
Statement st = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/urldb", "root", "root");
st = con.createStatement();
rs = st.executeQuery("select url, content from url_rule");
while(rs.next()) {
urlContentMap.put(rs.getString(1), rs.getString(2));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();