赞
踩
随着城市化的发展和城市人口的增加,现代大都市面临着严重的城市问题,如交通拥堵和不理想的城市资源规划等。近年来,随着技术的快速发展和不同的传感技术的广泛应用,大量的数据已成功收集并且记录了城市的各个方面的状态,这给解决都市问题和创建基于大城市大数据分析的智能城市带来了新的机遇。
尤其针对出租车GPS数据的数据分析更有价值,因为出租车满足了城市中不同人群的不同需求,同时出租车上的GPS定位终端可以定期采集多种信息,包括GPS进纬度坐标,速度,出租车行驶方向,出租车载客状态等,并且采集频率较高,采集持续时间较长,用户量较大,所以出租车的GPS数据规模更大,可获取的信息更加丰富,更加详细。而GPS数据是对用户在物理实践中实现及空间的最直接的描述,所以从出租车GPS的数据中能够挖掘的信息十分丰富。
项目的目的:
综合考虑城市交通的各个因素,帮助用户快速理解复杂城市交通状况及多元因素对城市交通的影响及作用效果,进而分析时需多元数据协同格式化结果的空间局促变化,提炼交通状况,利用出租车移动轨迹属于进一步进行分析模型参数,为交通治理手段提供证据参考,帮助相关部门对交通状况进行评估与决策与评估。
项目的意义:
二、数据描述
1、数据特征的描述
COMMADDR:车辆标识,出租车车牌信息,Int类型
UTC:时间戳,GPS采样时间,Int类型
LAT:经度坐标,出租车所在纬度,Int类型
LON:纬度坐标,出租车所在经度,Int类型
HEAD:方向角,出租车行驶方向,Int类型
SPEED:车辆速度,出租车行驶速度,Int类型
TELAG:车辆状态,出租车载客状态,Int类型
filter_$:全是1,Int类型
2、数据保存到hadoop的hdfs的实现
(1)打开集群
(2)编写代码
package org.example;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.net.URI;
public class HdfsTest {
// 声明FileSystem对象
private FileSystem fs;
/**
* 创建对象,同时创建FileSystem对象
*/
public HdfsTest() {
// 获取classpath下面的xxx-site.xml配置文件,并解析其内容,封装到conf对象中
Configuration config = new Configuration();
// java代码对conf中的配置信息进行手动设置,会覆盖xxx-site.xml中读取的属性值
config.set("fs.defaultFS", "hdfs://192.168.213.70:9000");
URI uri;
try {
uri = new URI("hdfs://192.168.213.70:9000");
// 根据配置信息,获取文件系统的客户端操作实例对象
fs = FileSystem.get(uri,config,"root");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
HdfsTest hdfsTest = new HdfsTest();
// 上传
hdfsTest.upload();
// 下载
hdfsTest.download();
// 删除
// hdfsTest.delete();
// // 列出文件
// hdfsTest.list();
//
// 释放资源
hdfsTest.close();
}
/**
* hdfs dfs -put ./file hdfs://hadoop1:9000/
* hdfs dfs -copyFromLocal ./file hadoop1://dfs01:9000/
* hdfs dfs -copyFromLocal ./file /
* @throws Exception
*/
private void upload() throws Exception {
// 本地目录
Path localPath = new Path("E:\\0912.csv");
// hdfs目录
Path hdfsPath = new Path("/");
// 调用上传方法
fs.copyFromLocalFile(localPath,hdfsPath);
}
/**
* hdfs dfs -copyToLocal /hdfs_test_file.txt ./
* @throws Exception
*/
private void download() throws Exception {
// hdfs目录
Path hdfsPath = new Path("/0912.csv");
// 本地目录
Path localPath = new Path("E:\\output2");
// 从HDFS中下载文件到本地
fs.copyToLocalFile(hdfsPath, localPath);
}
/**
* hdfs dfs -ls /
* @throws Exception
*/
private void list() throws Exception {
FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
for (FileStatus fss : fileStatuses) {
Path path = fss.getPath();
String name = path.getName();
System.out.println("文件名称" + name);
}
}
/**
* hdfs dfs -rm /file
* @throws Exception
*/
private void delete() throws Exception {
fs.delete(new Path("/0912.csv"), true);
}
private void close() throws Exception {
fs.close();
}
}
(3)上传效果展示
1、业务理解
我们找到了2013年9月12日一整天出租车相关数据,经过代码可以总结出9月12日每个小时出租车的数量和车载率。
(1)写出MR程序并执行
package org.example;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
public class CarGpsCsv {
public static class CarGpsCsvDemoMapper extends Mapper<LongWritable, Text, Text, Text> {
private Text hour = new Text();
private Text vehicle = new Text();
public static boolean isValidDate(String str) {
boolean convertSuccess = true;
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
try{
format.setLenient(false);
format.parse(str);
} catch (ParseException e) {
convertSuccess = false;
}
return convertSuccess;
}
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
String[] datas = value.toString().split(",");
if(datas.length == 0||datas.length !=8 || datas[0].toString().equals("time")) {
return;
}
String carId = datas[1];
String temp = datas[0];
int lastIndex = temp.lastIndexOf(":");
System.out.println("+++++++++++++++:" + temp.length() + "+++++++++++++++");
if (isValidDate(temp)){
return;
}
String hours = temp.substring(0, datas[0].indexOf(":"));
String passengerStatus = datas[datas.length - 2];
hour.set(hours);
vehicle.set(String.format("%s\t%s", carId, passengerStatus));
context.write(hour,vehicle);
}
}
public static class CarGpsCsvDemoReduce extends Reducer<Text, Text, Car, NullWritable> { private ConcurrentHashMap<String, String> map = new ConcurrentHashMap();
private Text vehicleNumber = new Text();
@Override
protected void reduce(Text hours, Iterable<Text> values, Context context) throws IOException,InterruptedException{
for (Text val : values) {
String datas[] = val.toString().split("\t");
String carId = datas[0];
String passengerStatus = datas[1];
String hasStatus = map.get(carId);
if(hasStatus == null) {
map.put(carId, passengerStatus);
} else{
hasStatus = "0".equals(hasStatus) ? passengerStatus : "1";
map.put(carId, hasStatus);
}
}
int carNumber = map.size();
int sum = 0;
Set<Map.Entry<String,String>> entries = map.entrySet();
for (Iterator<Map.Entry<String,String>> iterator = entries.iterator();
iterator.hasNext(); ) {
Map.Entry<String,String> next = iterator.next();
String value = next.getValue();
if("1".equals(value)) {
sum++;
}
}
double rates = sum / (carNumber * 1.0);
BigDecimal bd = new BigDecimal(rates);
double ratesTemp = bd.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
Car cd = new Car(hours.toString(), carNumber, ratesTemp);
context.write(cd, NullWritable.get());
}
} //以下换行有点问题,请自行更改
public static void main(String[] args) throws Exception { org.apache.hadoop.conf.Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "CarGps"); job.setJarByClass(CarGpsCsv.class); job.setMapperClass(CarGpsCsv.CarGpsCsvDemoMapper.class); job.setReducerClass(CarGpsCsv.CarGpsCsvDemoReduce.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); FileInputFormat.addInputPath(job, new org.apache.hadoop.fs.Path("E:\\0912.csv")); org.apache.hadoop.fs.Path path = new org.apache.hadoop.fs.Path("E:\\output6"); FileOutputFormat.setOutputPath(job, new Path("E:\\output6")); System.exit(job.waitForCompletion(true) ? 0 : 1); } }
三、分析结果展示
出租车数量与车载率增幅大体上是一致的。在05到06这个时间段车数量与车载率增长都比较快。这个时间段坐车的人比较多。在09时之后车载率就大致不发生较大改变了,而车数量也增长地平缓了。
四、总结
在这次的Hadoop编程课设期间,我利用Hadoop对出租车数据进行分析预测,发现出租车数量与车载率增幅大体上是一致的。在05到06这个时间段车数量与车载率增长都比较快。这个时间段坐车的人比较多。在09时之后车载率就大致不发生较大改变了,而车数量也增长地平缓了。分析出租车日常数据一方面可以为交通信息服务系统提供重要的交通路况信息,另一方面可以为城市交通的运营管理和运营特性分析提供重要的决策依据,以推动数字城市交通的智能化改革,还可以从侧面反映出城市居民出行的特性,为进行此方面就是学者提供依据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。