处理好的数据:安徽省大数据网络赛第二题
2 该题为数据处理常用处理方式,进行两个数据集的关联,原始数据集依然使用上述题1的log.log数据,另一数据集为cityid.txt。请完成数据关联。(10分)
数据格式:
1701|桐城市|桐城市|安徽|中国|安庆市|华东地区|四线城市|31.05228|116.93861
1702|宿松县|宿松县|安徽|中国|安庆市|华东地区|四线城市|30.151213|116.1142
1703|枞阳县|枞阳县|安徽|中国|安庆市|华东地区|四线城市|30.69371|117.21059
1704|太湖县|太湖县|安徽|中国|安庆市|华东地区|四线城市|30.420059|116.26508
1705|怀宁县|怀宁县|安徽|中国|安庆市|华东地区|四线城市|30.409006|116.64709
1706|岳西县|岳西县|安徽|中国|安庆市|华东地区|四线城市|30.857161|116.35818
1707|望江县|望江县|安徽|中国|安庆市|华东地区|四线城市|30.123537|116.67433
1.2题目的输出结果:
2.1请将1.2题目的输出结果中city的值对应编号关联匹配数据cityid.txt,将城市编码替换为城市名称输出,截图关联后的部分结果
思路:拿到第一个城市id,对两份数据进行路径处理,打上标记,对应的数据的标记,这样处理时候,分开处理了,然后开始进行分组,主要就是取每个城市id为key,这样分组reduce时候,用笛卡尔积来实现关联。
核心的算法:
Map阶段:
FileSplit inputSplie = (FileSplit) context.getInputSplit();
//获取路径信息
String path = inputSplie.getPath().toString();
//判断输入的路径信息
if(path.contains("log")){
String line = value.toString();
String split[] = line.split("\\s+");
//拿到cityId的值
String JoinKey = split[4].substring("cityid".length()+4,split[4].length()-1);
//将value打上标记
String JoinValue = "log.log"+split[0]+" "+split[1]+" "+split[2]+" "+split[3];
context.write(new Text(JoinKey), new Text(JoinValue));
}
//给CityId的数据进行打标记
if(path.contains("cityid")){
String line = value.toString();
String split[] = line.split("\\|");
//拿到cityId的值
String JoinKey = split[0];
//将value打上标记
String JoinValue = "cityid"+split[1];
context.write(new Text(JoinKey), new Text(JoinValue));
}
Reduce:
//创建两个集合
Vector<String> vecA = new Vector<String>();
Vector<String> vecB = new Vector<String>();
//判断两个输入数据的value,分别加入上面两个集合
for (Text value : v2) {
String line = value.toString();
//判断开头标记,放入集合
if(line.startsWith("log.log")){
vecA.add(line.substring("log.log".length()));
}
if(line.startsWith("cityid")){
vecB.add(line.substring("cityid".length()));
}
}
//将两个集合拼接,笛卡尔积
for (String a : vecA) {
for (String b : vecB) {
context.write(new Text(a+k2.toString()),new Text("cityid:"+b));
}
}
完整代码:
package jinsai_join;
import java.io.IOException;
import java.util.Vector;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;
import org.apache.hadoop.mapreduce.Job;
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;
public class MapRe_join {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException{
Configuration conf = new Configuration();
Job job = Job.getInstance(conf,MapRe_join.class.getSimpleName());
job.setJarByClass(MapRe_join.class);
//输入两个路径
FileInputFormat.addInputPath(job, new Path(args[0]));
FileInputFormat.addInputPath(job, new Path(args[1]));
//指定map类
job.setMapperClass(Map.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
//指定reduce的类
job.setReducerClass(Red.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
FileOutputFormat.setOutputPath(job, new Path(args[2]));
//提交任务,如果是true,会返回执行任务的进度信息
job.waitForCompletion(true);
}
public static class Map extends Mapper<LongWritable, Text, Text, Text>{
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
FileSplit inputSplie = (FileSplit) context.getInputSplit();
//获取路径信息
String path = inputSplie.getPath().toString();
//判断输入的路径信息
if(path.contains("log")){
String line = value.toString();
String split[] = line.split("\\s+");
//拿到cityId的值
String JoinKey = split[4].substring("cityid".length()+4,split[4].length()-1);
//将value打上标记
String JoinValue = "log.log"+split[0]+" "+split[1]+" "+split[2]+" "+split[3];
context.write(new Text(JoinKey), new Text(JoinValue));
}
//给CityId的数据进行打标记
if(path.contains("cityid")){
String line = value.toString();
String split[] = line.split("\\|");
//拿到cityId的值
String JoinKey = split[0];
//将value打上标记
String JoinValue = "cityid"+split[1];
context.write(new Text(JoinKey), new Text(JoinValue));
}
}
}
public static class Red extends Reducer<Text, Text, Text, Text>{
@Override
protected void reduce(Text k2, Iterable<Text> v2, Reducer<Text, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
//创建两个集合
Vector<String> vecA = new Vector<String>();
Vector<String> vecB = new Vector<String>();
//判断两个输入数据的value,分别加入上面两个集合
for (Text value : v2) {
String line = value.toString();
//判断开头标记,放入集合
if(line.startsWith("log.log")){
vecA.add(line.substring("log.log".length()));
}
if(line.startsWith("cityid")){
vecB.add(line.substring("cityid".length()));
}
}
//将两个集合拼接,笛卡尔积
for (String a : vecA) {
for (String b : vecB) {
context.write(new Text(a+k2.toString()),new Text("cityid:"+b));
}
}
}
}
}
结果:
部分城市id数据:
1701|桐城市|桐城市|安徽|中国|安庆市|华东地区|四线城市|31.05228|116.93861
1702|宿松县|宿松县|安徽|中国|安庆市|华东地区|四线城市|30.151213|116.1142
1703|枞阳县|枞阳县|安徽|中国|安庆市|华东地区|四线城市|30.69371|117.21059
1704|太湖县|太湖县|安徽|中国|安庆市|华东地区|四线城市|30.420059|116.26508
1705|怀宁县|怀宁县|安徽|中国|安庆市|华东地区|四线城市|30.409006|116.64709
1706|岳西县|岳西县|安徽|中国|安庆市|华东地区|四线城市|30.857161|116.35818
1707|望江县|望江县|安徽|中国|安庆市|华东地区|四线城市|30.123537|116.67433
1708|潜山县|潜山县|安徽|中国|安庆市|华东地区|四线城市|30.630346|116.5672
5317|迎江区|迎江区|安徽|中国|安庆市|华东地区|四线城市|30.511548|117.09115
5318|大观区|大观区|安徽|中国|安庆市|华东地区|四线城市|30.553957|117.02167
1691|怀远县|怀远县|安徽|中国|蚌埠市|华东地区|四线城市|32.95665|117.19356
1692|固镇县|固镇县|安徽|中国|蚌埠市|华东地区|四线城市|33.314575|117.31171
1693|五河县|五河县|安徽|中国|蚌埠市|华东地区|四线城市|33.139736|117.88253
1738|和县|和县|安徽|中国|巢湖市|华东地区|null|31.714224|118.36112
1739|含山县|含山县|安徽|中国|巢湖市|华东地区|null|31.720116|118.103
1740|庐江县|庐江县|安徽|中国|巢湖市|华东地区|null|31.253363|117.28835
1741|无为县|无为县|安徽|中国|巢湖市|华东地区|null|31.298515|117.91132
1754|东至县|东至县|安徽|中国|池州市|华东地区|null|30.09761|117.01768
1755|石台县|石台县|安徽|中国|池州市|华东地区|null|30.207769|117.4667
1756|青阳县|青阳县|安徽|中国|池州市|华东地区|null|30.636639|117.86305
5330|贵池区|贵池区|安徽|中国|池州市|华东地区|null|30.687181|117.567379
1717|天长市|天长市|安徽|中国|滁州市|华东地区|四线城市|32.690521|118.99815
1718|明光市|明光市|安徽|中国|滁州市|华东地区|四线城市|32.780071|117.98607
1719|全椒县|全椒县|安徽|中国|滁州市|华东地区|四线城市|32.098347|118.26437
1720|来安县|来安县|安徽|中国|滁州市|华东地区|四线城市|32.452389|118.42687
1721|定远县|定远县|安徽|中国|滁州市|华东地区|四线城市|32.530247|117.67569
1722|凤阳县|凤阳县|安徽|中国|滁州市|华东地区|四线城市|32.862991|117.55489
5321|琅琊区|琅琊区|安徽|中国|滁州市|华东地区|四线城市|32.29453|118.305843
5322|南谯区|南谯区|安徽|中国|滁州市|华东地区|四线城市|32.329841|118.296955
1723|界首市|界首市|安徽|中国|阜阳市|华东地区|四线城市|33.262821|115.35361
1724|临泉县|临泉县|安徽|中国|阜阳市|华东地区|四线城市|33.071312|115.25605
1725|颍上县|颍上县|安徽|中国|阜阳市|华东地区|四线城市|32.638569|116.25251
1726|阜南县|阜南县|安徽|中国|阜阳市|华东地区|四线城市|32.640636|115.58257
1727|太和县|太和县|安徽|中国|阜阳市|华东地区|四线城市|33.16544|115.60896
5323|颍州区|颍州区|安徽|中国|阜阳市|华东地区|四线城市|32.883468|115.806942
5324|颍东区|颍东区|安徽|中国|阜阳市|华东地区|四线城市|32.912478|115.856687
5325|颍泉区|颍泉区|安徽|中国|阜阳市|华东地区|四线城市|32.924918|115.808327
1685|长丰县|长丰县|安徽|中国|合肥市|华东地区|二线城市|32.483223|117.16139
1686|肥西县|肥西县|安徽|中国|合肥市|华东地区|二线城市|31.716938|117.15776
1687|肥东县|肥东县|安徽|中国|合肥市|华东地区|二线城市|31.887754|117.47131
1699|濉溪县|濉溪县|安徽|中国|淮北市|华东地区|null|33.915382|116.77503
5310|杜集区|杜集区|安徽|中国|淮北市|华东地区|null|33.991451|116.828134
5311|相山区|相山区|安徽|中国|淮北市|华东地区|null|33.959893|116.794345
5312|烈山区|烈山区|安徽|中国|淮北市|华东地区|null|33.895139|116.813042
1695|凤台县|凤台县|安徽|中国|淮南市|华东地区|null|32.705585|116.72009
2931|潘集区|潘集区|安徽|中国|淮南市|华东地区|null|32.78261944|116.8168306
5303|大通区|大通区|安徽|中国|淮南市|华东地区|null|32.631533|117.053273
5304|田家庵区|田家庵区|安徽|中国|淮南市|华东地区|null|32.647155|117.017409
5305|谢家集区|谢家集区|安徽|中国|淮南市|华东地区|null|32.599901|116.859048
5306|八公山区|八公山区|安徽|中国|淮南市|华东地区|null|32.631379|116.83349
1715|黄山区|黄山区|安徽|中国|黄山市|华东地区|null|30.3|118.13
1709|屯溪区|屯溪区|安徽|中国|黄山市|华东地区|null|29.71|118.3
1710|休宁县|休宁县|安徽|中国|黄山市|华东地区|null|29.781191|118.17577
1711|歙县|歙县|安徽|中国|黄山市|华东地区|null|29.86577|118.43394
1712|祁门县|祁门县|安徽|中国|黄山市|华东地区|null|29.854147|117.70698
1713|黟县|黟县|安徽|中国|黄山市|华东地区|null|29.933117|117.93021
5320|徽州区|徽州区|安徽|中国|黄山市|华东地区|null|29.827931|118.33652
1743|寿县|寿县|安徽|中国|六安市|华东地区|四线城市|32.575748|116.77711
175|霍山县|霍山县|安徽|中国|六安市|华东地区|四线城市|31.407784|116.32011
1744|霍邱县|霍邱县|安徽|中国|六安市|华东地区|四线城市|32.338554|116.26069
1745|舒城县|舒城县|安徽|中国|六安市|华东地区|四线城市|31.456448|116.93854
1746|金寨县|金寨县|安徽|中国|六安市|华东地区|四线城市|31.685169|115.85912
5327|金安区|金安区|安徽|中国|六安市|华东地区|四线城市|31.749265|116.539679
5328|裕安区|裕安区|安徽|中国|六安市|华东地区|四线城市|31.737813|116.47992
1697|当涂县|当涂县|安徽|中国|马鞍山市|华东地区|四线城市|31.555685|118.48344
5307|花山区|花山区|安徽|中国|马鞍山市|华东地区|四线城市|31.71971|118.492562
5308|雨山区|雨山区|安徽|中国|马鞍山市|华东地区|四线城市|31.682208|118.49856
5313|铜官山区|铜官山区|安徽|中国|铜陵市|华东地区|null|30.934236|117.815256
5314|狮子山区|狮子山区|安徽|中国|铜陵市|华东地区|null|30.950449|117.850342
1688|芜湖县|芜湖县|安徽|中国|芜湖市|华东地区|三线城市|31.147228|118.56583
1689|南陵县|南陵县|安徽|中国|芜湖市|华东地区|三线城市|30.924437|118.33241
1690|繁昌县|繁昌县|安徽|中国|芜湖市|华东地区|三线城市|31.090563|118.19427
5295|镜湖区|镜湖区|安徽|中国|芜湖市|华东地区|三线城市|31.32559|118.376343
5297|鸠江区|鸠江区|安徽|中国|芜湖市|华东地区|三线城市|31.369887|118.392536
1729|萧县|萧县|安徽|中国|宿州市|华东地区|四线城市|34.192528|116.93383
1730|泗县|泗县|安徽|中国|宿州市|华东地区|四线城市|33.478374|117.87888
1731|砀山县|砀山县|安徽|中国|宿州市|华东地区|四线城市|34.427879|116.34025
1732|灵璧县|灵璧县|安徽|中国|宿州市|华东地区|四线城市|33.545761|117.55181
1760|宁国市|宁国市|安徽|中国|宣城市|华东地区|null|30.619968|118.97754
1761|广德县|广德县|安徽|中国|宣城市|华东地区|null|30.894686|119.42019
1762|郎溪县|郎溪县|安徽|中国|宣城市|华东地区|null|31.134151|119.18147
1763|泾县|泾县|安徽|中国|宣城市|华东地区|null|30.68671|118.40659
1764|旌德县|旌德县|安徽|中国|宣城市|华东地区|null|30.291025|118.53877
1765|绩溪县|绩溪县|安徽|中国|宣城市|华东地区|null|30.077772|118.58411
5331|宣州区|宣州区|安徽|中国|宣城市|华东地区|null|30.946319|118.756328
149|合肥市|合肥市|安徽|中国|合肥市|华东地区|二线城市|31.863255|117.2757
403|芜湖市|芜湖市|安徽|中国|芜湖市|华东地区|三线城市|31.334496|118.35983
34|蚌埠市|蚌埠市|安徽|中国|蚌埠市|华东地区|四线城市|32.94161599|117.3356175
1694|淮南市|淮南市|安徽|中国|淮南市|华东地区|null|32.63000115|116.980002
1696|马鞍山市|马鞍山市|安徽|中国|马鞍山市|华东地区|四线城市|31.73000094|118.4800002
1698|淮北市|淮北市|安徽|中国|淮北市|华东地区|null|33.94998885|116.7499925
1700|铜陵市|铜陵市|安徽|中国|铜陵市|华东地区|null|30.953846|117.7875
11|安庆市|安庆市|安徽|中国|安庆市|华东地区|四线城市|30.49837531|117.0472002
165|黄山市|黄山市|安徽|中国|黄山市|华东地区|null|29.7219639|118.3172877
1714|黄山风景区|黄山风景区|安徽|中国|黄山市|华东地区|null|29.71468333|118.337475
1716|滁州市|滁州市|安徽|中国|滁州市|华东地区|四线城市|32.30000031|118.3000032
107|阜阳市|阜阳市|安徽|中国|阜阳市|华东地区|四线城市|32.90001392|115.8200032
1728|宿州市|宿州市|安徽|中国|宿州市|华东地区|四线城市|33.63990462|116.9997026
1737|巢湖市|巢湖市|安徽|中国|合肥市|华东地区|二线城市|31.58173543|117.6946442
1742|六安市|六安市|安徽|中国|六安市|华东地区|四线城市|31.74991089|116.4800943
1747|亳州市|亳州市|安徽|中国|亳州市|华东地区|null|33.86973504|115.7601057
1749|利辛县|利辛县|安徽|中国|亳州市|华东地区|null|33.133087|116.20302
1750|涡阳县|涡阳县|安徽|中国|亳州市|华东地区|null|33.51041|116.21124
1751|蒙城县|蒙城县|安徽|中国|亳州市|华东地区|null|33.268639|116.55575
1752|池州市|池州市|安徽|中国|池州市|华东地区|null|30.64977253|117.4802231
1757|九华山风景区|九华山风景区|安徽|中国|池州市|华东地区|null|30.48133807|117.803613
1758|宣城市|宣城市|安徽|中国|宣城市|华东地区|null|30.93999484|118.7400017
5291|瑶海区|瑶海区|安徽|中国|合肥市|华东地区|二线城市|31.858056|117.309225
5292|庐阳区|庐阳区|安徽|中国|合肥市|华东地区|二线城市|31.878641|117.264595
5293|蜀山区|蜀山区|安徽|中国|合肥市|华东地区|二线城市|31.851158|117.260536
5294|包河区|包河区|安徽|中国|合肥市|华东地区|二线城市|31.793093|117.309658
5296|弋江区|弋江区|安徽|中国|芜湖市|华东地区|三线城市|31.311851|118.372677
5298|三山区|三山区|安徽|中国|芜湖市|华东地区|三线城市|31.219568|118.268101
5299|龙子湖区|龙子湖区|安徽|中国|蚌埠市|华东地区|四线城市|32.943014|117.39379
5300|蚌山区|蚌山区|安徽|中国|蚌埠市|华东地区|四线城市|32.944198|117.367614
5301|禹会区|禹会区|安徽|中国|蚌埠市|华东地区|四线城市|32.929711|117.342451
5302|淮上区|淮上区|安徽|中国|蚌埠市|华东地区|四线城市|32.965435|117.359331