2012-06-11 11 views
6

मेरे डेटा प्रोसेसिंग में एक सामान्य पैटर्न कॉलम के कुछ सेट द्वारा समूह करना है, एक फ़िल्टर लागू करना है, फिर फिर से फ़्लैट करें। उदाहरण के लिए:अपाचे पिग: स्ट्रिप नेमस्पेस उपसर्ग (: :) समूह ऑपरेशन के बाद

my_data_grouped = group my_data by some_column; 
my_data_grouped = filter my_data_grouped by <some expression>; 
my_data = foreach my_data_grouped flatten(my_data); 

समस्या यहाँ यह है कि अगर की तरह एक स्कीमा के साथ my_data शुरू होता है (C1, C2, C3) इस ऑपरेशन के बाद यह (MyData :: सी 1, MyData :: c2, MyData की तरह एक स्कीमा होगा :: C3)। यदि स्तंभ अद्वितीय हैं तो "mydata ::" उपसर्ग को आसानी से बंद करने का कोई तरीका है?

मैं जानता हूँ कि मैं कुछ इस तरह कर सकते हैं:

my_data = foreach my_data generate c1 as c1, c2 as c2, c3 as c3; 

हालांकि कि अजीब और स्तंभों के बहुत सारे के साथ डेटा सेट के लिए बनाए रखने के लिए कठिन हो जाता है और चर कॉलम के साथ डेटा सेट के लिए असंभव है।

उत्तर

1

आप 'foreach' के समान लाइन पर 'AS' कथन डाल सकते हैं।

अर्थात

my_data_grouped = group my_data by some_column; 
my_data_grouped = filter my_data_grouped by <some expression>; 
my_data = FOREACH my_data_grouped FLATTEN(my_data) AS (c1, c2, c3); 

बहरहाल, यह सिर्फ 2 तर्ज पर यह कर के रूप में ही है, और 'चर कॉलम के साथ डेटा सेट' के लिए आपकी समस्या को दूर नहीं करता है।

3

यदि किसी स्कीमा के सभी फ़ील्ड में उपसर्गों (जैसे समूह 1 :: आईडी, समूह 1 :: राशि, आदि) का एक ही सेट होता है तो आप विशिष्ट फ़ील्ड को संदर्भित करते समय उपसर्ग को अनदेखा कर सकते हैं (और केवल उन्हें आईडी, राशि आदि के रूप में संदर्भित कर सकते हैं।)

वैकल्पिक रूप से, आप अभी भी आप इस प्रकार का यूडीएफ का उपयोग कर सकते लगाकर की एक एकल स्तर के एक स्कीमा पट्टी देख रहे हैं:

public class RemoveGroupFromTupleSchema extends EvalFunc<Tuple> { 

@Override 
public Tuple exec(Tuple input) throws IOException { 
    Tuple result = input; 
    return result; 
} 


@Override 
public Schema outputSchema(Schema input) throws FrontendException { 
    if(input.size() != 1) { 
     throw new RuntimeException("Expected input (tuple) but input does not have 1 field"); 
    } 

    List<Schema.FieldSchema> inputSchema = input.getFields(); 
    List<Schema.FieldSchema> outputSchema = new ArrayList<Schema.FieldSchema>(inputSchema); 
    for(int i = 0; i < inputSchema.size(); i++) { 
     Schema.FieldSchema thisInputFieldSchema = inputSchema.get(i); 
     String inputFieldName = thisInputFieldSchema.alias; 
     Byte dataType = thisInputFieldSchema.type; 

     String outputFieldName; 
     int findLoc = inputFieldName.indexOf("::"); 
     if(findLoc == -1) { 
      outputFieldName = inputFieldName; 
     } 
     else { 
      outputFieldName = inputFieldName.substring(findLoc+2); 
     } 
     Schema.FieldSchema thisOutputFieldSchema = new Schema.FieldSchema(outputFieldName, dataType); 
     outputSchema.set(i, thisOutputFieldSchema); 
    } 

    return new Schema(outputSchema); 
} 
} 
+0

इस यूडीएफ का उपयोग कैसे करें? अग्रिम में धन्यवाद। –

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