बेसिक गिनती की तरह उपयोग के रूप में किया जाता है अन्य उत्तर में कहा गया था, और सुअर दस्तावेज में:
logs = LOAD 'log';
all_logs_in_a_bag = GROUP logs ALL;
log_count = FOREACH all_logs_in_a_bag GENERATE COUNT(logs);
dump log_count
आप कर रहे हैं सही है कि उनकी गिनती भी सुअर के builtin COUNT का उपयोग करते समय, क्योंकि इस यू होगा, अक्षम है एक reducer से। हालांकि, आज मेरे पास एक रहस्योद्घाटन था कि इसे गति देने के तरीकों में से एक उस संबंध के राम उपयोग को कम करना होगा जिसे हम गिन रहे हैं।
दूसरे शब्दों में, जब संबंधों की गिनती करते हैं, तो हम वास्तव में डेटा के बारे में परवाह नहीं करते हैं, इसलिए जितना संभव हो उतना कम रैम का उपयोग करें। आप गिनती स्क्रिप्ट के अपने पहले पुनरावृत्ति के साथ सही रास्ते पर थे।
logs = LOAD 'log'
ones = FOREACH logs GENERATE 1 AS one:int;
counter_group = GROUP ones ALL;
log_count = FOREACH counter_group GENERATE COUNT(ones);
dump log_count
यह पिछले लिपि की तुलना में बहुत बड़े संबंधों पर काम करेगा और बहुत तेज होना चाहिए। इस और आपकी मूल लिपि के बीच मुख्य अंतर यह है कि हमें कुछ भी करने की आवश्यकता नहीं है।
logs = LOAD 'log'; --relation called logs, using PigStorage with tab as field delimiter
logs_grouped = GROUP logs ALL;--gives a relation with one row with logs as a bag
number = FOREACH LOGS_GROUP GENERATE COUNT_STAR(logs);--show me the number
मेरे पास है यह महत्वपूर्ण है केविन के कहने के लिए:
पहले समूह में बिना किसी अन्य नाम में पंक्तियों की संख्या गिनती करने के लिए यह संभव है? – zzz
वही प्रश्न। मैंने पढ़ा है कि 'ग्रुप एक्स ऑल' पाइपलाइन में एक क्रमिकरण को संभावित रूप से धीमा कर देगा। क्या वो सही है? –
आपको गिनने से पहले समूह करना होगा। Http://pig.apache.org/docs/r0.15.0/func.html#count के अनुसार: "COUNT को वैश्विक गणनाओं और समूह गणनाओं के लिए ग्रुप बाय स्टेटमेंट के लिए पिछले समूह के सभी विवरणों की आवश्यकता है।" –