के साथ हडोप में सफल रिकॉर्ड के बीच मतभेदों की गणना करें मेरे पास एक हाइव टेबल है जिसमें ग्राहक कॉल का डेटा है। सादगी के लिए मान लें कि इसमें 2 कॉलम हैं, पहले कॉलम में ग्राहक आईडी है और दूसरा कॉलम कॉल का टाइमस्टैम्प रखता है (यूनिक्स टाइमस्टैम्प)। प्रत्येक ग्राहक के लिएहाइड क्वॉरीज़
Customer1 timestamp11
Customer1 timestamp12
Customer1 timestamp13
Customer2 timestamp21
Customer3 timestamp31
Customer3 timestamp32
...
क्या यह संभव है एक हाइव क्वेरी कि रिटर्न बनाने के लिए,:
SELECT * FROM mytable SORT BY customer_id, call_time;
परिणाम है:
मैं प्रत्येक ग्राहक के लिए सभी कॉल्स खोजने के लिए इस तालिका क्वेरी कर सकता है , दूसरी कॉल से शुरू, दो सफल कॉल के बीच समय अंतराल? ऊपर उदाहरण के लिए कि क्वेरी लौटना चाहिए:
Customer1 timestamp12-timestamp11
Customer1 timestamp13-timestamp12
Customer3 timestamp32-timestamp31
...
मैं sql solution से समाधान अनुकूल करने के लिए कोशिश की है, लेकिन मैं हाइव सीमाओं के साथ अटक कर रहा हूँ: it accepts subqueries only in FROM और joins must contain only equalities।
धन्यवाद।
EDIT1:
मैं एक हाइव यूडीएफ फ़ंक्शन का उपयोग करने की कोशिश की:
public class DeltaComputerUDF extends UDF {
private String previousCustomerId;
private long previousCallTime;
public String evaluate(String customerId, LongWritable callTime) {
long callTimeValue = callTime.get();
String timeDifference = null;
if (customerId.equals(previousCustomerId)) {
timeDifference = new Long(callTimeValue - previousCallTime).toString();
}
previousCustomerId = customerId;
previousCallTime = callTimeValue;
return timeDifference;
}}
और इसका इस्तेमाल नाम "डेल्टा" के साथ।
लेकिन ऐसा लगता है (लॉग और परिणाम से) कि इसका उपयोग एमएपी समय पर किया जा रहा है। 2 समस्याओं इस से उत्पन्न होती हैं:
पहले: तालिका डेटा इस फ़ंक्शन का उपयोग करने से पहले ग्राहक आईडी और टाइमस्टैम्प के अनुसार क्रमबद्ध किया जाना चाहिए। क्वेरी:
SELECT customer_id, call_time, delta(customer_id, call_time) FROM mytable DISTRIBUTE BY customer_id SORT BY customer_id, call_time;
काम नहीं करता है क्योंकि सॉर्टिंग भाग REDUCE समय पर किया जाता है, मेरे फ़ंक्शन का उपयोग होने के कुछ समय बाद।
मैं फ़ंक्शन का उपयोग करने से पहले तालिका डेटा को सॉर्ट कर सकता हूं, लेकिन मैं इससे खुश नहीं हूं क्योंकि यह एक ओवरहेड है जिसे मैं टालना चाहता हूं।
दूसरा: एक वितरित Hadoop विन्यास के मामले में, डेटा उपलब्ध नौकरी ट्रैकर के बीच विभाजित है। इसलिए मेरा मानना है कि इस फ़ंक्शन के कई उदाहरण होंगे, प्रत्येक मैपर के लिए, इसलिए 2 मैपर के बीच एक ही ग्राहक डेटा विभाजित होना संभव है। इस मामले में मैं ग्राहक कॉल खो दूंगा, जो स्वीकार्य नहीं है।
मुझे नहीं पता कि इस समस्या को कैसे हल किया जाए। मुझे पता है कि वितरण द्वारा यह सुनिश्चित किया जाता है कि एक विशिष्ट मूल्य वाले सभी डेटा एक ही reducer को भेजा जाता है (इस प्रकार यह सुनिश्चित करना कि एसओआरटी अपेक्षित काम करता है), क्या किसी को पता है कि मैपर के लिए कुछ ऐसा है या नहीं?
अगला मैं कम स्क्रिप्ट का उपयोग करने के लिए libjack के सुझाव का पालन करने की योजना बना रहा हूं। कुछ अन्य हाइव प्रश्नों के बीच यह "गणना" की आवश्यकता है, इसलिए मैं बालास्वामी वाडेमन द्वारा सुझाए गए अनुसार, किसी अन्य टूल पर जाने से पहले, सब कुछ हाइव ऑफ़र का प्रयास करना चाहता हूं।
EDIT2:
मैं कस्टम स्क्रिप्ट समाधान की जांच के लिए शुरू कर दिया।
स्ट्रीमिंग आमतौर पर एक समान UDFs या InputFormat वस्तुओं कोडिंग की तुलना में कम कुशल है: लेकिन, प्रोग्रामिंग हाइव पुस्तक में 14 अध्याय (इस अध्याय कस्टम स्क्रिप्ट प्रस्तुत करता है) के प्रथम पृष्ठ में, मैं निम्नलिखित पैरा पाया। पाइप से बाहर में इसे पारित करने के लिए डेटा को क्रमबद्ध और deserializing अपेक्षाकृत अक्षम है। एक एकीकृत तरीके से पूरे प्रोग्राम को डीबग करना भी कठिन होता है। हालांकि, यह तेजी से प्रोटोटाइप और जावा में लिखे गए मौजूदा कोड का लाभ उठाने के लिए उपयोगी नहीं है। हाइव उपयोगकर्ताओं के लिए जो जावा कोड लिखना नहीं चाहते हैं, यह बहुत प्रभावी दृष्टिकोण हो सकता है।
तो यह स्पष्ट था कि कस्टम स्क्रिप्ट दक्षता के मामले में सबसे अच्छा समाधान नहीं है।
लेकिन मुझे अपना यूडीएफ फ़ंक्शन कैसे रखना चाहिए, लेकिन यह सुनिश्चित करें कि यह एक वितरित हडोप कॉन्फ़िगरेशन में अपेक्षित काम करता है? मुझे भाषा मैनुअल यूडीएफ विकी पेज के यूडीएफ आंतरिक अनुभाग में इस प्रश्न का उत्तर मिला। अगर मैं अपने प्रश्न लिखें:
SELECT customer_id, call_time, delta(customer_id, call_time) FROM (SELECT customer_id, call_time FROM mytable DISTRIBUTE BY customer_id SORT BY customer_id, call_time) t;
यह समय को कम करने और निर्माणों के द्वारा और एक तरह वितरित की गारंटी है कि एक ही ग्राहक से सभी रिकॉर्ड एक ही कम करने के द्वारा संसाधित किया जा रहा है, कॉल के क्रम में कम से क्रियान्वित किया जाता है।
तो उपरोक्त यूडीएफ और यह क्वेरी मेरी समस्या का समाधान करती है।
मुझे लगता है कि यह [इस सवाल] के समान है (http://stackoverflow.com/questions/14028796/reduce-a-set-of-rows-in-hive-to-another-set-of-rows) मैंने एक कस्टम मानचित्र/हाइव में कम करने के साथ उत्तर दिया। आपको बस उचित कमी स्क्रिप्ट प्रदान करनी होगी। – libjack
मुझे नहीं पता कि यह हाइव में कैसे करें लेकिन ऐसा करने के लिए कैस्केडिंग एपीआई है। कैस्केडिंग में बफर कहा जाता है। Http: //docs.cascading.org/cascading/2.0/userguide/html/ch05s05.html –