2015-06-06 6 views
5

में समस्याएं ग्रुप द्वारा मैं Google Big Query (और स्टैक ओवरफ़्लो) में नया हूं, मुख्य रूप से उस गति का परीक्षण करता हूं जिस पर बिग क्वेरी दोनों अच्छी तरह से तैयार किए गए और खराब तरीके से तैयार किए गए प्रश्नों को संसाधित करने का प्रबंधन करती है।Google बिग क्वेरी

मुझे एक बोझिल क्वेरी के साथ कठिनाई हो रही है जो MySQL पर (धीरे-धीरे) चलती है। बड़ी क्वेरी ग्रुप बाय सामग्री के बारे में शिकायत करती है।

SELECT nonstops.term, nonstops.lincat, nonstops.id, 
MIN(
(1-((LEAST(1,minusone.catimp/nonstops.catimp) + LEAST(1,minusone.catweb/nonstops.catweb))/2))* 
(1-((LEAST(1,minusone.catimp/nonstops.catimp) + LEAST(1,minusone.catweb/nonstops.catweb))/2))* 
(1-((LEAST(1,minusone.catimp/nonstops.catimp) + LEAST(1,minusone.catweb/nonstops.catweb))/2))* 
(nonstops.catweb * nonstops.catweb * nonstops.catimp/nonstops.fnvweb/nonstops.fnvimp) 
) 
AS calc FROM nonstops INNER JOIN EACH minusone ON nonstops.lincat = minusone.lincat AND nonstops.term = minusone.term 
WHERE nonstops.lincat = 556 GROUP BY nonstops.term, nonstops.lincat 
ORDER BY `calc` DESC 

ध्यान दें कि "प्रत्येक" आंतरिक में जोड़ा जाता है शामिल हों के रूप में दोनों तालिकाओं बड़े हैं: यहाँ शुरू करने क्वेरी है। मैंने इसे पढ़ने में आसान बनाने के लिए डेटासेट नाम हटा दिया है।

ग्रुप बाय का उद्देश्य प्रत्येक शब्द/लिनकैट जोड़ी के लिए शामिल होने से गणना की गई गणना के सबसे कम मूल्य को वापस करने का इरादा है।

त्रुटि मैं मिलता है:

(एल 1: 62): अभिव्यक्ति 'phrases.nonstops.id' की सूची

कौन सा मैं में नहीं करना चाहती द्वारा समूह में मौजूद नहीं है ग्रुप द्वारा, लेकिन मैं इसे जोड़ दिया है और मैं तो मिलती है:

अभिव्यक्ति 'calc' कौन सा मैं भी नहीं कर सूची

द्वारा समूह में मौजूद नहीं है चाहते हैं! लेकिन अगर मैं इसे जोड़ने मैं:

(एल 7: 1): Can समूह नहीं एक समग्र

से मैं प्रलेखन को देखा और एक जवाब के लिए खोज की है, लेकिन कोई किस्मत। किसी भी संकेत या लिंक की सराहना की जाएगी।

उत्तर

3

जब आप BigQuery (या किसी भी SQL) में किसी चीज़ द्वारा समूह करते हैं तो परिणामी फ़ील्ड या तो समूह-समूह या समेकन होना चाहिए।

अन्यथा, nonstops.id का कौन सा मान आपको प्राप्त करना चाहिए? कई जोड़ी (nonstops.term, nonstops.lincat) से जुड़ी हो सकती हैं।

आप आईडी फ़ील्ड के अधिकतम, न्यूनतम, आदि का चयन कर सकते हैं; इस क्षेत्र द्वारा समूह (लेकिन फिर आप प्रत्येक टुपल शब्द, लिंगकैट और आईडी के लिए गणना प्राप्त करते हैं); या अगर आपको इसकी आवश्यकता नहीं है तो बस इस फ़ील्ड को हटा दें - यदि आप प्रत्येक (nonstops.term, nonstops.lincat) जोड़ी के लिए 'calc' अभिव्यक्ति का परिणाम चाहते हैं।

BigQuery 'calc` के बारे में शिकायत करने का कारण अलग है - BigQuery (जब आप विरासत एसक्यूएल बोली का उपयोग करते हैं) उद्धरण के लिए बैकटिक्स (`) का उपयोग नहीं करता है। तो ऐसा लगता है कि वे नाम का हिस्सा हैं और यह 'कैल्क' फ़ील्ड से अलग एक नया क्षेत्र है। बस उन्हें हटाएं या BigQuery के उद्धरण [और] - [calc] का उपयोग करें। या मानक एसक्यूएल बोली पर स्विच करें।

+0

धन्यवाद माइकल, बैकटीक्स वास्तव में एक समस्या थी। ग्रुप बाय से लापता आईडी फ़ील्ड एक अच्छा बिंदु है, इस डेटा के लिए यह MySQL में ठीक काम करता है क्योंकि परिणाम प्रत्येक समूह के लिए एक ही आईडी का उत्पादन करने के लिए जाने जाते हैं (थोड़ा अनावश्यक लेकिन आईडी पर इंडेक्स का उपयोग किया जाता है)। मैंने इसे सुझाव के रूप में बदल दिया और यह काम किया। – LocalGeek

+0

जोड़ना चाहिए, प्रदर्शन के अनुसार, इसमें 75 सेकंड (2.5 जीबी डेटा) लिया गया। क्वेरी को जॉइन में विभाजित करना (डेटा का एक सेट बनाना) फिर ग्रुप बाय चलाना 20 सेकंड और फिर 15 सेकंड लेता है। 32 जीबी 2133 मेगाहर्ट्ज रैम वाला एक लिनक्स बॉक्स, 8 जीबी माइस्क्लुएल द्वारा इस्तेमाल किया गया एक सैमसंग 840 एसएसडी पर डेटा के साथ एक बहुत धीमी एएमडी ए 10 प्रोसेसर (7850 के) पूर्ण क्वेरी के लिए लगभग 2000 सेकंड लेता है या उन्हें विभाजित करता है। – LocalGeek

+0

प्रदर्शन-वाइस मुझे लगता है कि जॉइन से पहले फ़िल्टरिंग करके आपको लाभ हो सकता है (BigQuery अपने आप को अभी तक करने के लिए पर्याप्त स्मार्ट नहीं है): चुनें ... से चुनें (चुनें .. नॉनस्टॉप से ​​जहां lincat = 556) INNER शामिल हों प्रत्येक (चयन .. minusone से कहां LINCAT = 556) पर nonstops.lincat = minusone.lincat और nonstops.term = minusone.term nonstops.term द्वारा समूह, द्वारा calc DESC आदेश nonstops.lincat – Michael

संबंधित मुद्दे