2012-08-02 25 views
22

chương trình của tôi trông giống nhưHadoop: java.lang.ClassCastException: org.apache.hadoop.io.LongWritable không thể được đúc để org.apache.hadoop.io.Text

public class TopKRecord extends Configured implements Tool { 

    public static class MapClass extends Mapper<Text, Text, Text, Text> { 

     public void map(Text key, Text value, Context context) throws IOException, InterruptedException { 
      // your map code goes here 
      String[] fields = value.toString().split(","); 
      String year = fields[1]; 
      String claims = fields[8]; 

      if (claims.length() > 0 && (!claims.startsWith("\""))) { 
       context.write(new Text(year.toString()), new Text(claims.toString())); 
      } 
     } 
    } 
    public int run(String args[]) throws Exception { 
     Job job = new Job(); 
     job.setJarByClass(TopKRecord.class); 

     job.setMapperClass(MapClass.class); 

     FileInputFormat.setInputPaths(job, new Path(args[0])); 
     FileOutputFormat.setOutputPath(job, new Path(args[1])); 

     job.setJobName("TopKRecord"); 
     job.setMapOutputValueClass(Text.class); 
     job.setNumReduceTasks(0); 
     boolean success = job.waitForCompletion(true); 
     return success ? 0 : 1; 
    } 

    public static void main(String args[]) throws Exception { 
     int ret = ToolRunner.run(new TopKRecord(), args); 
     System.exit(ret); 
    } 
} 

Dữ liệu trông giống như

"PATENT","GYEAR","GDATE","APPYEAR","COUNTRY","POSTATE","ASSIGNEE","ASSCODE","CLAIMS","NCLASS","CAT","SUBCAT","CMADE","CRECEIVE","RATIOCIT","GENERAL","ORIGINAL","FWDAPLAG","BCKGTLAG","SELFCTUB","SELFCTLB","SECDUPBD","SECDLWBD" 
3070801,1963,1096,,"BE","",,1,,269,6,69,,1,,0,,,,,,, 
3070802,1963,1096,,"US","TX",,1,,2,6,63,,0,,,,,,,,, 
3070803,1963,1096,,"US","IL",,1,,2,6,63,,9,,0.3704,,,,,,, 
3070804,1963,1096,,"US","OH",,1,,2,6,63,,3,,0.6667,,,,,,, 

Khi chạy phần mềm này, tôi thấy sau trên console

12/08/02 12:43:34 INFO mapred.JobClient: Task Id : attempt_201208021025_0007_m_000000_0, Status : FAILED 
java.lang.ClassCastException: org.apache.hadoop.io.LongWritable cannot be cast to org.apache.hadoop.io.Text 
    at com.hadoop.programs.TopKRecord$MapClass.map(TopKRecord.java:26) 
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:396) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121) 
    at org.apache.hadoop.mapred.Child.main(Child.java:249) 

tôi tin rằng các loại lớp được ánh xạ một cách chính xác, 01.Class Mapper,

Vui lòng cho tôi biết tôi đang làm gì sai ở đây?

Trả lời

39

Khi bạn đọc tệp có chương trình M/R, khóa đầu vào của người lập bản đồ phải là chỉ mục của dòng trong tệp, trong khi giá trị đầu vào sẽ là dòng đầy đủ. Vì vậy, đây là những gì đang xảy ra là bạn đang cố gắng để có chỉ số dòng như là một đối tượng Text đó là sai, và bạn cần một LongWritable để Hadoop không phàn nàn về loại.

Hãy thử điều này thay vì:

public class TopKRecord extends Configured implements Tool { 

    public static class MapClass extends Mapper<LongWritable, Text, Text, Text> { 

     public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
      // your map code goes here 
      String[] fields = value.toString().split(","); 
      String year = fields[1]; 
      String claims = fields[8]; 

      if (claims.length() > 0 && (!claims.startsWith("\""))) { 
       context.write(new Text(year.toString()), new Text(claims.toString())); 
      } 
     } 
    } 

    ... 
} 

Cũng có một điều trong mã của bạn mà bạn có thể muốn xem xét lại, bạn đang tạo ra 2 Text đối tượng cho mỗi bản ghi bạn chế biến. Bạn chỉ nên tạo 2 đối tượng này ngay từ đầu và sau đó trong trình ánh xạ của bạn, chỉ cần đặt giá trị của chúng bằng cách sử dụng phương thức set. Điều này sẽ giúp bạn tiết kiệm rất nhiều thời gian nếu bạn đang xử lý một lượng dữ liệu phong nha.

8

bạn cần phải thiết lập định dạng đầu vào lớp

job.setInputFormatClass(KeyValueTextInputFormat.class); 
job.setOutputFormatClass(TextOutputFormat.class); 
+1

điểm tốt! đây là lỗi trong trường hợp của tôi, được giải quyết bằng cách đặt InputFormatClass thành 'SequenceFileInputFormat.class'. Điều này làm việc khi đầu vào của công việc này là đầu ra của một công việc trước đó – vefthym

Các vấn đề liên quan