2012-10-31 19 views
6

मैं पिगस्क्रिप्ट के लिए अपेक्षाकृत नया हूं। मैं जानना चाहता हूं कि पिग में जावा यूडीएफ को पैरामीटर पास करने का कोई तरीका है या नहीं?क्या मैं पिग स्क्रिप्ट में यूडीएफ को पैरामीटर पास कर सकता हूं?

यहां परिदृश्य है: मेरे पास एक लॉग फ़ाइल है जिसमें अलग-अलग कॉलम हैं (प्रत्येक एक अन्य तालिका में प्राथमिक कुंजी का प्रतिनिधित्व करता है)। मेरा कार्य चयनित कॉलम में अलग प्राथमिक कुंजी मानों की गिनती प्राप्त करना है। मैंने एक सुअर लिपि लिखी है जो अलग प्राथमिक कुंजी प्राप्त करने और उन्हें गिनने का काम करता है। हालांकि, अब मुझे प्रत्येक कॉलम के लिए एक नया यूडीएफ लिखना है। क्या ऐसा करने के लिए इससे अच्छा तरीका है? जैसे कि मैं यूडीएफ में पैरामीटर के रूप में एक पंक्ति संख्या पास कर सकता हूं, यह मुझे कई यूडीएफ लिखने की आवश्यकता से बचाता है।

exec(Tuple input) 

और पहुँच DEFINE और निर्माता का उपयोग करके इसे

input.get(index) 

उत्तर

0

हाँ, आप किसी भी पैरामीटर अपने यूडीएफ के टपल पैरामीटर इनपुट में पारित कर सकते हैं यूडीएफ का। तो यहां एक ग्राहक "स्प्लिटर" का एक उदाहरण है:

REGISTER com.sample.MyUDFs.jar; 
DEFINE CommaSplitter com.sample.MySplitter(','); 

B = FOREACH A GENERATE f1, CommaSplitter(f2); 

उम्मीद है कि इस विचार को व्यक्त करता है।

+0

हां फ्रेड। लेकिन मैं पिगस्क्रिप्ट पक्ष से पैरामीटर कैसे पास करूं? – emkay

+0

मुझे नहीं पता कि यह क्या है जो आप करना चाहते हैं लेकिन आप प्राथमिक क्षेत्र के साथ पहले फ़ील्ड के रूप में एक नया टुपल बना सकते हैं और डेटा जो आप वास्तव में अपने यूडीएफ को शेष फ़ील्ड के रूप में पास करना चाहते हैं: 'FOREACH tupleForUdf GENERATE प्राथमिककी, *; ' – Frederic

3

तरह से उपयोग करते हुए यह है क्या करने के लिए:

1

मापदंडों आप अपने pigscript में निम्नलिखित है पारित करने के लिए:

UDF(document, '$param1', '$param2', '$param3') 

संपादित करें: सुनिश्चित नहीं करता है, तो उन पैरामीटर 'या wrappedin जाने की जरूरत है' नहीं

अपने यूडीएफ में जबकि

आप कार्य करें:

public class UDF extends EvalFunc<Boolean> { 



public Boolean exec(Tuple input) throws IOException { 

    if (input == null || input.size() == 0) 
     return false; 

    FileSystem fs = FileSystem.get(UDFContext.getUDFContext().getJobConf()); 


    String var1 = input.get(1).toString(); 
    InputStream var1In = fs.open(new Path(var1)); 


    String var2 = input.get(2).toString(); 
    InputStream var2In = fs.open(new Path(var2)); 

    String var3 = input.get(3).toString(); 
    InputStream var3In = fs.open(new Path(var3)); 



    return doyourthing(input.get(0).toString()); 
} 
} 

उदाहरण

के लिए