2010-07-25 18 views
5

मैं इस जावा कोड है में जेनरिक के साथ स्थिर जावा वर्गों के उपवर्गों संदर्भ के लिए कैसे:स्काला

public class TestMapper extends AppEngineMapper<Key, Entity, NullWritable, NullWritable> { 
    public TestMapper() { 
    } 
// [... other overriden methods ...] 
     @Override 
     public void setup(Context context) { 
     log.warning("Doing per-worker setup"); 
     } 
} 

... जो मैं करने के लिए परिवर्तित कर दिया है:

class TestMapper extends AppEngineMapper[Key, Entity, NullWritable, NullWritable] { 
// [... other overriden methods ...] 
     override def setup(context: Context) { 
     log.warning("Doing per-worker setup") 
     } 
} 

अब वास्तविक समस्या :

प्रसंग एक नेस्टेड सीएल के रूप में परिभाषित किया गया है org.apache.hadoop.mapreduce.Mapper वर्ग के भीतर गधा:

 public static class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> { 
    //[... some other methods ...] 
protected void setup(org.apache.hadoop.mapreduce.Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT>.Context context) throws java.io.IOException, java.lang.InterruptedException { /* compiled code */ } 
     public class Context extends org.apache.hadoop.mapreduce.MapContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT> { 

     public Context(org.apache.hadoop.conf.Configuration configuration, org.apache.hadoop.mapreduce.TaskAttemptID conf, org.apache.hadoop.mapreduce.RecordReader<KEYIN,VALUEIN> taskid, org.apache.hadoop.mapreduce.RecordWriter<KEYOUT,VALUEOUT> reader, org.apache.hadoop.mapreduce.OutputCommitter writer, org.apache.hadoop.mapreduce.StatusReporter committer, org.apache.hadoop.mapreduce.InputSplit reporter) throws java.io.IOException, java.lang.InterruptedException { /* compiled code */ } 

     } 

तो मैं अपने स्काला वर्ग नहीं बता सकता, जहां/क्या प्रसंग वास्तव में है। यदि मैपर कोई जेनरिक था मैं संदर्भ सकता प्रसंग के माध्यम से

Mapper#Context 

लेकिन मैं कैसे बता सकता है कि मैपर जेनेरिक्स है?

Mapper[_,_,_,_]#Context 

... काम नहीं किया।

+1

प्रश्न के लिए बहुत बहुत धन्यवाद, मैंने इन कक्षाओं में कई घंटे बिताए हैं! –

उत्तर

9

आप अपने मामले में, अपने प्रकार प्रक्षेपण के लिए सटीक आधार प्रकार की आपूर्ति करने के लिए है

Mapper[Key, Entity, NullWritable, NullWritable]#Context 

तो अधिभावी setup रूप

override def setup(context: Mapper[Key, Entity, NullWritable, NullWritable]#Context) 

प्रयोग लिखा जाएगा एक प्रकार उर्फ ​​शुरू करने से सरल किया जा सकता

class TestMapper extends AppEngineMapper[Key, Entity, NullWritable, NullWritable] { 

    type Context = Mapper[Key, Entity, NullWritable, NullWritable]#Context 

    override def setup(context: Context) = { 
     // ... 
    } 
} 

यदि आप एकाधिक मैपर लिखना चाहते हैं

trait SMapper[A,B,C,D] extends Mapper[A,B,C,D] { 
    type Context = Mapper[A,B,C,D]#Context 
} 

class TestMapper extends AppEngineMapper[Key, Entity, NullWritable, NullWritable] 
        with SMapper[Key, Entity, NullWritable, NullWritable] { 
    override def setup(context: Context) = { 
    // ... 
    } 
} 

या सादे Hadoop के लिए: यदि आप एक विशेषता अपने कार्यान्वयन में मिलाया जा सकता है कि में इस refactor कर सकते हैं

class TestMapper extends SMapper[Key, Entity, NullWritable, NullWritable] { 
    override def setup(context: Context) = { 
    // ... 
    } 
} 
+2

आपको वास्तव में अस्तित्व के प्रकार की आवश्यकता नहीं है; चूंकि सेटअप मैपर का एक तरीका है जिसे ओवरराइड किया जा रहा है, आप केवल मैपर [ए, बी, सी, डी] # कॉन्टेक्स्ट (या एक प्रकार उपनाम) का उपयोग कर सकते हैं जैसा कि आप पहले सुझाव देते हैं। –

+0

मैंने अपने ओपी में कुछ जानकारी जोड़ दी है जो समस्या को बेहतर रूप से रेखांकित कर सकती है: * मैपर स्थिर है (यदि यह मायने रखता है ...) * मैंने क्लास हेडर ... आपके पहले समाधान नहीं किए हैं ' टी काम नहीं मुझे त्रुटि: परिभाषित और विरासत सदस्य के बीच नाम संघर्ष: विधि सेटअप: (संदर्भ: TestMapper1.this.Ctx) इकाई और विधि सेटअप: (x $ 1: org.apache.hadoop.mapreduce.Mapper [KEYIN , VALUEIN, KEYOUT, VALUEOUT] #Context) कक्षा में इकाई AppEngineMapper में मिटाने के बाद एक ही प्रकार है: (संदर्भ: org.apache.hadoop.mapreduce।मैपर # संदर्भ) यूनिट डीफ़ सेटअप ओवरराइड (संदर्भ: सीटीएक्स) { मुझे यकीन नहीं है कि तीसरा समाधान (उसी त्रुटि) को कैसे लागू करें – Alex

+0

उत्तर के लिए धन्यवाद, लेकिन मैं इनमें से किसी को संकलित नहीं कर पाया एक ही त्रुटि के साथ समाधान। –

0

समस्याओं लोग कभी-कभी जब स्वीकार किए जाते हैं जवाब का उपयोग करने में बग के कारण कर रहे हैं स्कैला कंपाइलर (link)।