2015-04-22 4 views
8

मैं उच्च-आयामी लकड़ी की छत फ़ाइलों में लोड कर रहा हूं लेकिन केवल कुछ कॉलम की आवश्यकता है। मेरे वर्तमान कोड लगता है:स्पार्क में अधिक कुशलता से लोड लकड़ी की फाइलें कैसे करें (pySpark v1.2.0)

dat = sqc.parquetFile(path) \ 
      .filter(lambda r: len(r.a)>0) \ 
      .map(lambda r: (r.a, r.b, r.c)) 

क्या हो रहा है की मेरी मानसिक मॉडल है कि यह सभी डेटा में लोड हो रहा है है, फिर कॉलम मैं नहीं चाहता कि बाहर फेंक। मैं स्पष्ट रूप से उन कॉलमों में भी पढ़ने के लिए पसंद नहीं करता, और जो मुझे लगता है कि लकड़ी के बारे में जो मुझे लगता है उससे संभव है।

  1. मेरी मानसिक मॉडल गलत है:

    तो दो सवाल कर रहे हैं? या स्पार्क कंपाइलर स्मार्ट है जो ऊपर दिए गए उदाहरण में कॉलम ए, बी, और सी में केवल पढ़ने के लिए पर्याप्त है?

  2. डेटा में अधिक कुशलतापूर्वक पढ़ने के लिए मैं sqc.parquetFile() को कैसे मजबूर कर सकता हूं?
+0

मैं अपने अवसरों को केवल पढ़ने के लिए की जरूरत कॉलम अधिक होगा प्राप्त करने के लिए लगता है कि अगर आप 'map' _before_' filter' – sds

उत्तर

4

आप स्पार्क DataFrame एपीआई का उपयोग करना चाहिए: https://spark.apache.org/docs/1.3.0/sql-programming-guide.html#dataframe-operations

कुछ

तरह
dat.select("a", "b", "c").filter(lambda r: len(r.a)>0) 

या आप स्पार्क एसक्यूएल का उपयोग कर सकते हैं:

dat.regiserTempTable("dat") 
sqc.sql("select a, b, c from dat where length(a) > 0") 
0

स्पार्क हमेशा एक देशी स्कैला सुविधा का उपयोग करके आलसी तरीके से चीजें करते हैं। स्कैला कोड पहले ही संकलित है, और यह रनटाइम स्मार्ट बनाता है, मेरा मतलब आलसी, निर्णय है। लकड़ी के साथ, इसे केवल कोड द्वारा संदर्भित आवश्यक डेटा को पढ़ना चाहिए। बेशक यह विशेष लकड़ी की छत फ़ाइल की संरचना पर निर्भर करता है। मुद्दा यह है कि यह स्तंभ स्तंभ का लाभ उठाएगा। मुझे पायथन के बारे में पर्याप्त जानकारी नहीं है, लेकिन यह वही काम करने में सक्षम होना चाहिए। शायद जांचें कि क्या पाइस्पार्क पंक्ति वर्ग कुछ प्रकार के आलसी जादू का उपयोग करता है। सत्यापित करने का एक त्वरित तरीका एक नियंत्रित प्रयोग करना है, एक और rdd ऑपरेशन लिखें जो अधिक फ़ील्ड का संदर्भ देता है, लेकिन उन्हें आउटपुट नहीं करता है। फिर आप 2 संचालन के बीच दीवार घड़ी के समय के अंतर की तुलना कर सकते हैं। अंतर्निहित लकड़ी की छत फ़ाइल के कुछ प्रासंगिक विवरणों के आधार पर, आप अंतर को नहीं देख सकते हैं, भले ही यह आलसी लोडिंग करता हो।

0

डिस्क से हाँ, यह केवल चयनित होगा क्षेत्रों।

"सभी डेटा फ़ाइलों को खोलता है, लेकिन केवल उस कॉलम के मान वाले प्रत्येक फ़ाइल के हिस्से को पढ़ता है। कॉलम मान लगातार संग्रहित होते हैं, I/O को कम से कम एक कॉलम के भीतर मानों को संसाधित करने के लिए आवश्यक होता है।"

यह प्रलेखन इम्पाला के लिए है, मैं तर्क पढ़ने लगता है कि चिंगारी के लिए एक ही है भी http://www.cloudera.com/documentation/archive/impala/2-x/2-1-x/topics/impala_parquet.html#parquet_data_files_unique_1

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