मैं एक बड़े डेटासेट के साथ काम कर रहा हूं, जिसे दो कॉलम - plant_name
और tag_id
द्वारा विभाजित किया गया है। दूसरे विभाजन - tag_id
200000 अद्वितीय मूल्य हैं और मैं ज्यादातर विशिष्ट tag_id
मूल्यों से डेटा का उपयोग। यदि मैं निम्नलिखित स्पार्क कमांड का उपयोग करता हूं:स्पार्क समर्थन पक्षियों के साथ विभाजन छिद्रण
sqlContext.setConf("spark.sql.hive.metastorePartitionPruning", "true")
sqlContext.setConf("spark.sql.parquet.filterPushdown", "true")
val df = sqlContext.sql("select * from tag_data where plant_name='PLANT01' and tag_id='1000'")
मुझे एक तेज प्रतिक्रिया की उम्मीद होगी क्योंकि यह एक विभाजन को हल करता है। हाइव और प्रेस्टो में इसमें सेकंड लगते हैं, हालांकि स्पार्क में यह घंटों तक चलता है।
वास्तविक डेटा एस 3 बाल्टी में आयोजित किया जाता है, और जब मैं एसक्यूएल क्वेरी सबमिट करता हूं, स्पार्क बंद हो जाता है और पहले हाइव मेटास्टोर (उनमें से 200000) से सभी विभाजन प्राप्त होते हैं, और फिर पूर्ण स्थिति को मजबूर करने के लिए refresh()
पर कॉल करते हैं S3 वस्तु की दुकान में इन सभी फ़ाइलों की सूची (वास्तव में listLeafFilesInParallel
बुला)।
यह दो ऑपरेशन इतने महंगे हैं, क्या ऐसी कोई सेटिंग है जो स्पार्क को पहले विभाजन को छीनने के लिए मिल सकती है - या तो मेटाडेटा स्टोर पर कॉल के दौरान या तुरंत बाद में?
मैं भी एक अतिरिक्त config पैरामीटर के साथ ऊपर कोड की कोशिश की है: 'sqlContext.setConf (" spark.sql.hive.verifyPartitionPath "," गलत ")' प्रदर्शन पर कोई प्रभाव नहीं के साथ – Euan
यह एक दिलचस्प है प्रश्न, लेकिन जवाब देना मुश्किल है क्योंकि आप वर्णन नहीं करते कि 'tag_data' के लिए डेटाफ्रेम कैसे बनाया गया है। मुझे लगता है कि प्रश्न का विस्तार करना एक अच्छा विचार होगा ताकि यह अपने आप पर पुन: उत्पन्न हो। –
अगर मुझे हाइव और लकड़ी की छत के बारे में और पता था, तो शायद मैं चाहता था। जैसा कि है, मुझे नहीं पता कि एक (दोगुनी) विभाजित लकड़ी की छत फ़ाइल कैसे बनाएं। और यह मेरे लिए अस्पष्ट है अगर आप सीधे लकड़ी की छत फ़ाइल का उपयोग कर रहे हैं या यदि हाइव किसी भी तरह से शामिल है। (हाइव का कई बार उल्लेख किया गया है, लेकिन मुझे नहीं पता कि यह कितनी भूमिका निभाता है यदि यह सिर्फ एक पैराक्वेट फ़ाइल है।) –