不多说,直接上代码。
一共12列,我们只需提取有用的列:第二列(犯罪类型)、第四列(一周的哪一天)、第五列(具体时间)和第七列(犯罪场所)。
思路分析基于项目的需求,我们通过以下几步完成:
1、首先根据数据集,分别统计出不同犯罪类别在周时段内发生犯罪次数和不同区域在周时段内发生犯罪的次数。
2、然后根据第一步的输出结果,再按日期统计出每天每种犯罪类别在每个区域发生的犯罪次数。
3、将前两步的输出结果,按需求插入数据库,便于对犯罪数据的分析。
程序开发我们要编写5个文件:
编写基类,MapReduceJobBase.java
数据处理类,DataFile.java
编写第一个任务类,SanFranciscoCrime.java
编写第二个任务类,SanFranciscoCrimePrepOlap.java
编写第三个任务,插入数据库类,LoadStarDB.java
Hive那边的 数据库首先需要创建4个表,
分别为:category(name,cid)、
district(name,did)、
fact(fid,district_id,category_id,time_id,crimes)和
timeperiod(tpid,year,month,week,day)。
编译和执行MapReduce作业1、myclipse将项目编译和打包为crime.jar,使用SSH将crime.jar上传至hadoop的/home/hadoop/目录下。
2、使用cd /home/hadoop/djt 切换到当前目录,通过命令行执行任务。
2.1 首先执行第一个作业 SanFranciscoCrime.java。
hadoop jar crime.jar zhouls.bigdata.myMapReduce.SanFranciscoCrime.SanFranciscoCrime2.2 然后执行第二个作业SanFranciscoCrimePrepOlap.java。
hadoop jar crime.jar zhouls.bigdata.myMapReduce.SanFranciscoCrime.SanFranciscoCrimePrepOlap2.3 最后执行第三个作业LoadStarDB.java,将数据插入数据库。
hadoop jar crime.jar zhouls.bigdata.myMapReduce.SanFranciscoCrime.LoadStarDB 运行结果任务的最终结果插入数据库,数据结果如下图所示。字段分别为:区域主键district_id、类别主键category_id、时间主键time_id、犯罪次数crimes和主键fid。
代码
package zhouls.bigdata.myMapReduce.SanFranciscoCrime;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.hadoop.conf.Configured;
/**
*
* @function 在 MapReduce 基类中,定义基础成员变量,减少 MapReduce 主类的工作量
*
*
*/
public class MapReduceJobBase extends Configured
{
/**
* 犯罪类型在犯罪数据数组的下标为1的位置
*/
protected static final int CATEGORY_COLUMN_INDEX = 1;
/**
* 礼拜几在犯罪数据数组的下标为3的位置
*/
protected static final int DAY_OF_WEEK_COLUMN_INDEX = 3;
/**
* 日期在犯罪数据数组的下标为4的位置
*/
protected static final int DATE_COLUMN_INDEX = 4;
/**
* 犯罪区域在犯罪数据数组的下标为6的位置
*/
protected static final int DISTRICT_COLUMN_INDEX = 6;
/**
* 定义日期的数据格式
*/
protected static final DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
/**
* 定义 map/reduce job结果中,日期的输出格式
*/
protected static final DateFormat outputDateFormat = new SimpleDateFormat("yyyy/MM/dd");
/**
* @function 将字符串格式的日期转换为自定义Date类型的日期
* @param value 包含完整的日期字符串
* @return Date类型的日期
* @throws ParseException
*/
protected static Date getDate(String value) throws ParseException
{
Date retVal = null;
String[] dp = value.split(" ");
if (dp.length > 0) {
retVal = df.parse(dp[0]);
}
return retVal;
}
}
package zhouls.bigdata.myMapReduce.SanFranciscoCrime;
import java.io.BufferedReader;