हडूप अनुक्रम फ़ाइल संग्रह

एक reducer (एक पाठ कुंजी और एक इटेरबल मानचित्र के साथ मूल्य) कैसे अपने सभी मानचित्र को एक अनुक्रम फ़ाइल में आउटपुट कर सकते हैं ताकि इसकी कुंजी पर समूह को संरक्षित किया जा सके? उदाहरण के लिए, मान लें कि मैपर रेड्यूसर को रिकॉर्ड भेजते हैं जो इस तरह दिखते हैं:

<"dog", {<"name", "Fido">, <"pure bred?", "false">, <"type", "mutt">}>
<"cat", {<"name", "Felix">, <"color", "black">, <"origin", "film">, <"date", "1919">}>
<"dog", {<"name", "Lassie">, <"type", "collie">, <"origin", " short story">}>

मैं अनुक्रम फ़ाइल को इस प्रकार लिखा जाना चाहूंगा:

key = "dog"
value =  {
            {<"name", "Fido">, <"pure bred?", "false">, <"type", "mutt">},
            {<"name", "Lassie">, <"type", "collie">, <"origin", "short story">}
         }

key = "cat"
value = {
            {<"name", "Felix">, <"color", "black">, <"origin", "film">, <"date", "1919">}
        }

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

TIA,

0

1 उत्तर

जैसा कि आप ध्यान देते हैं, आप एक कस्टम लिखने योग्य बना सकते हैं जो ArrayWritable :

public class MapWritableArray extends ArrayWritable {
    public MapWritableArray() {
        super(MapWritable.class);
    }
}

फिर आपके reducer में आपको एक सरणी में MapWritable मानों के पुनरावर्तनीय जमा करने की आवश्यकता होगी (मूल्यों को प्रतिलिपि बनाने के लिए अंतर्निहित सामग्री प्रत्येक पुनरावृत्ति के साथ बदलना याद रखें)। कुछ ऐसा (पूरी तरह से अनचाहे, संकलित संकलित नहीं है और अनुकूलित नहीं है):

MapWritableArray mapWritableArray = new MapWritableArray();
ArrayList valList = new ArrayList();
for (MapWritable value : values) {
    MapWritable copy = ReflectionUtils.newInstance(context.getConfiguration(), MapWritable.class);
    ReflectionUtils.copy(context.getConfiguration, value, copy);
    valList.add(copy);
}
mapWritableArray.set(valList.toArray(new MapWritable[0]));
0
जोड़ा