2012-08-02 15 views
22
में ढाला नहीं जा सकता

मेरे कार्यक्रम लग रहा है डेटाHadoop: java.lang.ClassCastException: org.apache.hadoop.io.LongWritable 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); 
    } 
} 

"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,,,,,,, 

इस कार्यक्रम मैं कंसोल पर निम्न

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) 

मुझे विश्वास है कि कक्षा प्रकार सही ढंग से मैप की जाती हैं,देखना चल परClass Mapper,

कृपया मुझे बताएं कि मैं यहां क्या कर रहा हूं?

उत्तर

39

जब आप एम/आर प्रोग्राम के साथ फ़ाइल पढ़ते हैं, तो आपके मैपर की इनपुट कुंजी फ़ाइल में लाइन की अनुक्रमणिका होना चाहिए, जबकि इनपुट मान पूर्ण रेखा होगी।

तो यहां क्या हो रहा है यह है कि आप लाइन इंडेक्स को Text ऑब्जेक्ट के रूप में गलत करने की कोशिश कर रहे हैं, और आपको इसके बजाय LongWritable की आवश्यकता है ताकि हैडोप प्रकार के बारे में शिकायत न करे।

ऐसा करें:

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())); 
      } 
     } 
    } 

    ... 
} 

इसके अलावा अपने कोड में एक बात यह है कि आप पर पुनर्विचार करने के लिए, आप हर रिकॉर्ड आप प्रोसेस कर रहे हैं के लिए 2 Text वस्तुओं बना रहे हैं चाहते हो सकता है। आपको केवल शुरुआत में ही इन 2 ऑब्जेक्ट्स को बनाना चाहिए, और फिर अपने मैपर में केवल set विधि का उपयोग कर अपने मान सेट करें। यदि आप एक सभ्य डेटा संसाधित कर रहे हैं तो यह आपको बहुत समय बचाएगा।

8

आप इनपुट प्रारूप वर्ग

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

अच्छा बिंदु निर्धारित करने की जरूरत है! यह मेरे मामले में त्रुटि थी, जिसे इनपुटफॉर्मैट क्लास को 'अनुक्रम FileInputFormat.class' पर सेट करके हल किया गया था। यह तब काम करता था जब इस नौकरी का इनपुट पिछली नौकरी का उत्पादन था – vefthym

संबंधित मुद्दे