2016-09-21 5 views
5

मैं स्पार्क एसक्यूएल जहां जिसके परिणामस्वरूप स्कीमा तरह लग रहा है का उपयोग कर लकड़ी प्रारूप में कुछ डेटा लिखने के बाद:स्पार्क एसक्यूएल में नेस्टेड कॉलम के साथ क्वेरी प्रदर्शन अलग क्यों है?

root 
|-- stateLevelCount1: integer (nullable = false) 
|-- stateLevelCount2: integer (nullable = false) 
|-- stateLevelCount3: integer (nullable = false) 
|-- stateLevelCount4: integer (nullable = false) 
|-- stateLevelCount5: integer (nullable = false) 
|-- countryLevelCount1: integer (nullable = false) 
|-- countryLevelCount2: integer (nullable = false) 
|-- countryLevelCount3: integer (nullable = false) 
|-- countryLevelCount4: integer (nullable = false) 
|-- countryLevelCount5: integer (nullable = false) 
|-- globalCount1: integer (nullable = false) 
|-- globalCount2: integer (nullable = false) 
|-- globalCount3: integer (nullable = false) 
|-- globalCount4: integer (nullable = false) 
|-- globalCount5: integer (nullable = false) 
:

root 
|-- stateLevel: struct (nullable = true) 
| |-- count1: integer (nullable = false) 
| |-- count2: integer (nullable = false) 
| |-- count3: integer (nullable = false) 
| |-- count4: integer (nullable = false) 
| |-- count5: integer (nullable = false) 
|-- countryLevel: struct (nullable = true) 
| |-- count1: integer (nullable = false) 
| |-- count2: integer (nullable = false) 
| |-- count3: integer (nullable = false) 
| |-- count4: integer (nullable = false) 
| |-- count5: integer (nullable = false) 
|-- global: struct (nullable = true) 
| |-- count1: integer (nullable = false) 
| |-- count2: integer (nullable = false) 
| |-- count3: integer (nullable = false) 
| |-- count4: integer (nullable = false) 
| |-- count5: integer (nullable = false) 

मैं भी एक और अधिक फ्लैट स्कीमा कि इस तरह दिखता है में एक ही डेटा बदल सकता है

अब जब मैं global.count1 जैसे कॉलम पर पहले डेटा सेट पर कोई क्वेरी चलाता हूं, तो दूसरे डेटा सेट में globalCount1 से पूछताछ करने में बहुत अधिक समय लगता है। इसके विपरीत, पैराक्वेट में पहला डेटा सेट लिखना दूसरा डेटा सेट लिखने से बहुत छोटा होता है। मुझे पता है कि मेरा डेटा लकड़ी के कारण कॉलमर फैशन में संग्रहीत है, लेकिन मैं सोच रहा था कि सभी नेस्टेड कॉलम व्यक्तिगत रूप से एक साथ संग्रहीत किए जाएंगे। उदाहरण के लिए पहले डेटा सेट में, ऐसा लगता है कि संपूर्ण 'वैश्विक' कॉलम को 'global.count1', 'global.count2' आदि के विपरीत एक साथ संग्रहीत किया जा रहा है। मूल्यों को एक साथ संग्रहीत किया जा रहा है। क्या यह अपेक्षित व्यवहार है?

उत्तर

0

दिलचस्प। "यह पूछताछ से बहुत अधिक समय लेता है .." क्या आप कृपया कितना समय साझा कर सकते हैं? धन्यवाद।

कोड https://github.com/Parquet/parquet-mr/blob/master/parquet-column/src/main/java/parquet/io/RecordReaderImplementation.java#L248 पर देखकर ऐसा लगता है कि संरचनाओं से पढ़ने से कुछ ओवरहेड हो सकता है। यह सिर्फ "बहुत लंबा" नहीं होना चाहिए, हालांकि केवल लकड़ी के कोड को देख रहा है।

मुझे लगता है कि बड़ी समस्या यह है कि स्पार्क इस तरह के मामलों में भविष्यवाणी कैसे कर सकता है। उदाहरण के लिए, यह ऐसे मामलों में ब्लूम फ़िल्टर का उपयोग करने में सक्षम नहीं हो सकता है। क्या आप कृपया साझा कर सकते हैं कि आप दोनों मामलों और समय में डेटा कैसे क्वेरी करते हैं। स्पार्क, लकड़ी की छत, हडोप आदि के कौन से संस्करण?

पैराक्वेट-1.5 में https://issues.apache.org/jira/browse/PARQUET-61 समस्या थी जो इस तरह के कुछ मामलों में 4-5x मंदी का कारण बन सकती है।

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