1.Iterator迭代器:Iterator迭代器中只有一个对象,遍历迭代器返回的只有一个对象,遍历的都是一个对象,只是属性值不一样。
public class MyIterator implements Iterator<DDTaxi> {
static BufferedReader br;
static {
try {
br = new BufferedReader(new FileReader("D:\\IDEA_workspace\\demo1_db\\hadoopdemo1\\src\\main\\data\\ddtaxi\\line.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/**
* 如果hasNext返回true才会调用next方法获取数据
*
* @return
*/
String line;
@Override
public boolean hasNext() {
try {
line = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return line==null?false:true;
}
/**
* 使用一个对象就可以接受所有的数据
*/
DDTaxi d = new DDTaxi();
@Override
public DDTaxi next() {
//处理行数据
String[] split = line.split(",");
String startTime = split[0];
String endTime = split[1];
d.setEndTime(endTime);
d.setStartTime(startTime);
return d;
}
}
public class Test {
public static void main(String[] args) {
MyIterator myIterator = new MyIterator();
List<DDTaxi> list = new ArrayList<>();
while (myIterator.hasNext()) {
DDTaxi dd = myIterator.next();
list.add(dd);
}
System.out.println(list);
}
}
public class DDTaxi {
private String startTime;
private String endTime;
@Override
public String toString() {
return "DDTaxi{" +
"startTime='" + startTime + '\'' +
", endTime='" + endTime + '\'' +
'}';
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public DDTaxi(String startTime, String endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
public DDTaxi() {
}
}
2.包装类型值为null转为对应的基本数据类型报空指针异常,注意包装类型和对应的基本数据的转换问题。
3.为什么内部类一定要加static修饰,mr程序的才能正常运行?
/* @Description: 对Skew1进行二次Mr程序
* a-0 880 a-1 850-->a 1730
*/
public class Skew2 {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
skew2Start();
}
public static void skew2Start() throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, Skew2.class.getSimpleName());
job.setMapperClass(Skew2Mapper.class);
job.setReducerClass(Skew2Reducer.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
// job.setNumReduceTasks(2);
FileInputFormat.setInputPaths(job, new Path("D:\\IDEA_workspace\\demo1_db\\hadoopdemo1\\src\\main\\data\\skewoutput1"));
FileOutputFormat.setOutputPath(job, new Path("D:\\IDEA_workspace\\demo1_db\\hadoopdemo1\\src\\main\\data\\skewoutput2"));
boolean b = job.waitForCompletion(true);
System.exit(b?0:-1);
}
class Skew2Mapper extends Mapper<LongWritable, Text, Text, IntWritable> {
Text k = new Text();
IntWritable v = new IntWritable();
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String[] split = line.split("-");
String word = split[0];
k.set(word);
String[] split1 = split[1].split("\\s+");
int count = Integer.parseInt(split1[1]);
v.set(count);
context.write(k,v);
}
}
class Skew2Reducer extends Reducer<Text, IntWritable, Text, IntWritable> {
IntWritable v = new IntWritable();
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int count = 0;
for (IntWritable value : values) {
count += value.get();
}
v.set(count);
context.write(key,v );
}
}
}
2020-09-25 19:42:37,343 WARN [org.apache.hadoop.mapred.LocalJobRunner] - job_local516756027_0001
java.lang.Exception: java.lang.RuntimeException: java.lang.NoSuchMethodException: com.jiubx.hadoop.skew.Skew2$Skew2Mapper.<init>()
at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:492)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:552)
Caused by: java.lang.RuntimeException: java.lang.NoSuchMethodException: com.jiubx.hadoop.skew.Skew2$Skew2Mapper.<init>()
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:135)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:759)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:347)
at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:271)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NoSuchMethodException: com.jiubx.hadoop.skew.Skew2$Skew2Mapper.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.getDeclaredConstructor(Class.java:2178)
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:129)
... 8 more
2020-09-25 19:42:38,196 INFO [org.apache.hadoop.mapreduce.Job] - Job job_local516756027_0001 running in uber mode : false
2020-09-25 19:42:38,206 INFO [org.apache.hadoop.mapreduce.Job] - map 0% reduce 0%
2020-09-25 19:42:38,209 INFO [org.apache.hadoop.mapreduce.Job] - Job job_local516756027_0001 failed with state FAILED due to: NA
2020-09-25 19:42:38,225 INFO [org.apache.hadoop.mapreduce.Job] - Counters: 0
外部类访问成员内部类信息,需通过内部类实例,无法直接访问。静态内部类对象可不依赖于外部类对象,直接创建。
4.异常总结?
抛出运行时异常能通过编译。