2015-07-10 2 views
5

मैं समझ नहीं रहा है कि समस्या के साथ कैसे पेश:हाइव - तरह ऑपरेटर

Table1:   Table2: 
BRAND   PRODUCT   SOLD 
Sony   Sony ABCD   1233 
Apple   Sony adv   1233 
Google   Sony aaaa   1233 
IBM    Apple 123   1233 
etc.   Apple 345   1233 
       IBM 13123   1233 

यह क्वेरी है कि मैं एक मेज है फिल्टर करने के लिए जहां खड़ा है संभव है:

ये मेरी डाटा कर रहे हैं ब्रांड और कुल बेचा जाता है? मेरा विचार है:

Select table1.brand, sum(table2.sold) from table1 
join table2 
on (table1.brand LIKE '%table2.product%') 
group by table.1.brand 

यह मेरा विचार था, लेकिन मैं हमेशा एक त्रुटि

सबसे बड़ी समस्या मिल तरह-ऑपरेटर है या कोई अन्य समाधान है?

+0

http://stackoverflow.com निम्न क्वेरी देखें/प्रश्न/40628396/हाइव-जैसे-ऑपरेटर कृपया जांचें और सलाह दें उपरोक्त समान प्रश्न के लिए। धन्यवाद –

उत्तर

7

मुझे दो मुद्दे दिखाई देते हैं: सबसे पहले, हाइव में जॉइन केवल समानता की स्थिति के साथ काम करते हैं, जैसे कि वहां काम नहीं करना है।

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

केवल समानता मिलती है, बाहरी मिलती है, और छोड़ दिया अर्द्ध हाइव में समर्थित हैं मिलती है। हाइव उन स्थितियों की स्थिति का समर्थन नहीं करता है जो समानता की स्थिति नहीं हैं क्योंकि नक्शा/नौकरी कम करने जैसी स्थितियों को व्यक्त करना बहुत मुश्किल है।

इसके बजाय, यह एक खंड में जाना चाहता है।

दूसरा, मुझे इस तरह के कथन के साथ एक समस्या भी दिखाई देती है: '% table2.product%' का अर्थ शाब्दिक रूप से स्ट्रिंग '% table2.product%' के रूप में किया जा रहा है। इसके अतिरिक्त, भले ही यह इरादा कर रहा था, यह ब्रांड के अंदर table2.product को देखने का प्रयास करेगा, जब आप इसे दूसरी तरफ देखना चाहते हैं। मूल्यांकन का मूल्यांकन करने के लिए, आपको table1.brand की सामग्री में वाइल्डकार्ड जोड़ना होगा; इसे पूरा करने के लिए, आप अपने वाइल्डकार्ड को अपनी अभिव्यक्ति में जोड़ना चाहते हैं।

table2.product LIKE concat('%',table1.brand,'%')) 

ऐसा करने से, आपके जैसे स्ट्रिंग '% सोनी%', '% एप्पल%' ... आदि '% table2.product%' के बजाय के लिए मूल्यांकन करेंगे।

SELECT table1.brand, SUM(table2.sold) 
FROM table1, table2 
WHERE table2.product LIKE concat('%', table1.brand, '%') 
GROUP BY table1.brand; 
4

तुम एक में शामिल हों के बिना यह पूरा करने में सक्षम होना चाहिए:

तुम क्या चाहते ब्रैंडन बेल का प्रश्न है, जो मैं इस जवाब में विलय कर दिया गया है।

SELECT table1.brand, sum(table2.sold) 
FROM table1, table2 
WHERE table2.product LIKE concat('%', table1.brand, '%') 
GROUP BY table1.brand; 

यह रिटर्न

Apple 2466 
IBM  1233 
Sony 3699 

मेरे इनपुट फ़ाइलें इस प्रकार हैं::

Sony 
Apple 
Google 
IBM  

और

Sony ABCD  1233 
Sony adv  1233 
Sony aaaa  1233 
Apple 123  1233 
Apple 345  1233 
IBM 13123  1233 
+0

बस यह स्पष्ट करने के लिए कि एक अंतर्निहित जुड़ाव एक जुड़ाव है। प्रदर्शन के अनुसार वे वही होना चाहिए। "ए से, बी जहां एआईडी = बीआईआईडी" एआईडी = बीआईआईडी पर एक जॉइन बी से "के लिए वाक्य रचनात्मक चीनी है। :) – invoketheshell

+0

स्पष्टीकरण के लिए धन्यवाद। –