2011-06-17 10 views
7

मैं हाइव में उप-चयन कैसे कर सकता हूं? मुझे लगता है कि मैं वास्तव में एक स्पष्ट गलती है कि मेरे लिए बहुत स्पष्ट नहीं है ...हैडोप हाइव क्वेरी: मल्टी-जॉइन

त्रुटि मैं प्राप्त कर रहा हूँ बनाने जा सकता है: FAILED: Parse Error: line 4:8 cannot recognize input 'SELECT' in expression specification

यहाँ मेरी तीन स्रोत तालिकाओं हैं:

aaa_hit -> [SESSION_KEY, HIT_KEY, URL] 
aaa_event-> [SESSION_KEY,HIT_KEY,EVENT_ID] 
aaa_session->[SESSION_KEY,REMOTE_ADDRESS] 

.. .और मुझे क्या करना चाहते हैं इस तरह एक परिणाम तालिका में परिणाम सम्मिलित है:

result -> [url, num_url, event_id, num_event_id, remote_address, num_remote_address] 

... जहां स्तंभ 1 यूआरएल, कॉलम 3 यूआरएल प्रति शीर्ष 1 "घटना" है, और स्तंभ 5 टी है वह उस URL पर जाने के लिए शीर्ष 1 REMOTE_ADDRESS। (यहां तक ​​कि कॉलम पिछले कॉलम के "गिनती" हैं।)

Soooooo ... मैंने यहां क्या गलत किया?

INSERT OVERWRITE TABLE result2 
SELECT url, 
     COUNT(url) AS access_url, 
     (SELECT events.event_id as evt, 
       COUNT(events.event_id) as access_evt 
     FROM aaa_event events 
       LEFT OUTER JOIN aaa_hit hits 
       ON (events.hit_key = hit_key) 
       ORDER BY access_evt DESC LIMIT 1), 
     (SELECT sessions.remote_address as remote_address, 
       COUNT(sessions.remote_address) as access_addr 
     FROM aaa_session sessions 
       RIGHT OUTER JOIN aaa_hit hits 
       ON (sessions.session_key = session_key) 
       ORDER BY access_addr DESC LIMIT 1) 
FROM aaa_hit 
ORDER BY access_url DESC; 

बहुत बहुत शुक्रिया :)

+0

क्या त्रुटि आप दे छत्ता है? हाइव एक काफी उपयोगी त्रुटि और क्वेरी में सटीक स्थिति देता है जो इसकी समस्या पैदा कर रहा है। इससे आपको क्वेरी में सटीक स्थान को देखने की अनुमति मिलनी चाहिए जिससे समस्याएं पैदा हो रही हैं, या हम कर सकते हैं। – Nija

+0

अच्छा बिंदु। मुझे 4: 8, या पहले उप-चयन कथन की शुरुआत में त्रुटि मिल रही है। अधिक विशेष रूप से: 'विफल: पार्स त्रुटि: पंक्ति 4: 8 अभिव्यक्ति विनिर्देश' – batman

उत्तर

10

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SubQueries

Hive supports subqueries only in the FROM clause.

आप हाइव में एक 'स्तंभ' के रूप में एक सबक्वेरी उपयोग नहीं कर सकते।

इसके आसपास काम करने के लिए आप उस उपरोक्त को FROM खंड और JOIN में उपयोग करना चाहेंगे। (नीचे काम करेंगे नहीं, लेकिन यह विचार है)

SELECT url, 
     COUNT(url) AS access_url, 
     t2.col1, t2.col2 ... 
FROM aaa_hit 
JOIN (SELECT events.event_id as evt, 
       COUNT(events.event_id) as access_evt 
     FROM aaa_event events 
       LEFT OUTER JOIN aaa_hit hits 
       ON (events.hit_key = hit_key) 
       ORDER BY access_evt DESC LIMIT 1), 
     (SELECT sessions.remote_address as remote_address, 
       COUNT(sessions.remote_address) as access_addr 
     FROM aaa_session sessions 
       RIGHT OUTER JOIN aaa_hit hits 
       ON (sessions.session_key = session_key) 
       ORDER BY access_addr DESC LIMIT 1) t2 
ON (aaa_hit.THING = t2.THING) 

चेक बाहर https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins अधिक जानकारी के लिए हाइव में मिलती है के प्रयोग पर।

+0

में इनपुट 'चयन' को पहचान नहीं सकता है तो क्या मुझे एक और तालिका बनाना है? – batman

+1

जानना अच्छा है कि मैं ऐसा नहीं कर सकता, लेकिन मुझे इसके आसपास कैसे जाना चाहिए? – batman

+0

@ ट्रेविस पॉवेल: अतिरिक्त विवरण – Nija

0

आपके पास ग्रुपबी ऑपरेशन नहीं है, गणना एक समेकन है। ग्रुपबी क्लॉज के बिना केवल गिनती (*) काम करती है।

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+GroupBy

+1

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लिंक केवल स्टैक ओवरफ़्लो पर ही उत्तर दिए जाते हैं, आप लिंक के महत्वपूर्ण हिस्सों को ले कर और इसे अपने उत्तर में डालकर इस उत्तर को बेहतर बना सकते हैं, यह सुनिश्चित करता है कि लिंक का उत्तर अभी भी एक उत्तर है बदल जाता है या हटा दिया जाता है :) – WhatsThePoint