一个phone.txt文件有id,日期,手机号码、型号、操作系统字段,要求根据文件的手机号码前三位判断是移动,电信还是联通,并分析2022年手机运营商市场占比情况,基于MapReduce用JAVA语言完成
时间: 2024-03-25 21:38:47 浏览: 92
智能手机操作系统介绍
好的,我理解您的要求了。首先,您需要编写一个MapReduce程序,对phone.txt文件进行处理,根据手机号码前三位判断其运营商,并将结果输出到不同的文件中。然后,您需要对输出文件进行分析,得出2022年手机运营商市场占比情况。下面是一个参考的代码实现:
1. MapReduce程序代码
```java
public class PhoneMapper extends Mapper<LongWritable, Text, Text, Text> {
private Text outputKey = new Text();
private Text outputValue = new Text();
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] fields = value.toString().split(",");
String phoneNumber = fields[2];
String operator = getOperator(phoneNumber);
outputKey.set(operator);
outputValue.set(phoneNumber + "," + fields[3] + "," + fields[4]);
context.write(outputKey, outputValue);
}
private String getOperator(String phoneNumber) {
String prefix = phoneNumber.substring(0, 3);
if (prefix.equals("130") || prefix.equals("131") || prefix.equals("132") || prefix.equals("155") || prefix.equals("156")) {
return "中国联通";
} else if (prefix.equals("133") || prefix.equals("153") || prefix.equals("180") || prefix.equals("189")) {
return "中国电信";
} else if (prefix.equals("134") || prefix.equals("135") || prefix.equals("136") || prefix.equals("137") || prefix.equals("138") || prefix.equals("139")
|| prefix.equals("147") || prefix.equals("150") || prefix.equals("151") || prefix.equals("152") || prefix.equals("157") || prefix.equals("158")
|| prefix.equals("159") || prefix.equals("182") || prefix.equals("183") || prefix.equals("184") || prefix.equals("187") || prefix.equals("188")
|| prefix.equals("198")) {
return "中国移动";
} else {
return "未知";
}
}
}
public class PhoneReducer extends Reducer<Text, Text, Text, Text> {
private Text outputValue = new Text();
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
int count = 0;
for (Text value : values) {
count++;
}
outputValue.set(String.valueOf(count));
context.write(key, outputValue);
}
}
public class PhoneDriver {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "Phone Operator Count");
job.setJarByClass(PhoneDriver.class);
job.setMapperClass(PhoneMapper.class);
job.setReducerClass(PhoneReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
```
2. 分析程序代码
```java
public class PhoneAnalyzer {
public static void main(String[] args) throws IOException {
Map<String, Integer> operatorCounts = new HashMap<>();
BufferedReader reader = new BufferedReader(new FileReader(args[0]));
String line;
while ((line = reader.readLine()) != null) {
String[] fields = line.split("\t");
String operator = fields[0];
int count = Integer.parseInt(fields[1]);
operatorCounts.put(operator, count);
}
reader.close();
int total = operatorCounts.values().stream().mapToInt(Integer::intValue).sum();
DecimalFormat df = new DecimalFormat("0.00%");
System.out.println("中国移动占比:" + df.format((float) operatorCounts.get("中国移动") / total));
System.out.println("中国联通占比:" + df.format((float) operatorCounts.get("中国联通") / total));
System.out.println("中国电信占比:" + df.format((float) operatorCounts.get("中国电信") / total));
System.out.println("未知占比:" + df.format((float) operatorCounts.get("未知") / total));
}
}
```
在运行程序时,需要将phone.txt文件放到Hadoop的文件系统中,并执行以下命令:
```
hadoop jar Phone.jar PhoneDriver /input/phone.txt /output
```
其中,/input/phone.txt是输入文件路径,/output是输出目录路径。
执行MapReduce程序后,会生成三个文件,分别是part-r-00000、part-r-00001和part-r-00002。这些文件中的内容就是每个运营商的用户数量。
最后,执行分析程序,统计出每个运营商的占比情况。
注意:为了保证分析程序的正确性,需要对输出文件进行合并,并按照运营商名称排序。
阅读全文