2015-09-01 15 views
6

में कोई फ़ाइल मौजूद है या नहीं, मैं यह जांचना चाहता हूं कि स्पार्ककॉन्टेक्स्ट द्वारा लोड करने से पहले एचडीएफएस में कई फाइलें मौजूद हैं या नहीं। मैं पाइस्पार्क का उपयोग करता हूं। मैंने os.system("hadoop fs -test -e %s" %path) की कोशिश की लेकिन मेरे पास जांच करने के लिए बहुत सारे पथ हैं, नौकरी दुर्घटनाग्रस्त हो गई। मैंने sc.wholeTextFiles(parent_path) भी कोशिश की और फिर कुंजी द्वारा फ़िल्टर किया। लेकिन यह भी क्रैश हो गया क्योंकि parent_path में बहुत से उप पथ और फ़ाइलें हैं। क्या आप मेरी मदद कर सकते हैं?pyspark: एचडीएफएस

उत्तर

1

rigth यह कैसे कहते हैं Tristan Reid:

... (स्पार्क) यह कई प्रारूपों पढ़ सकते हैं, और यह Hadoop ग्लोब भाव है, जो HDFS में कई रास्तों से पढ़ने के लिए बहुत उपयोगी होते हैं का समर्थन करता है, लेकिन यह नहीं करता है एक अंतर्निहित सुविधा नहीं है जिसे मैं ट्रैवर्सिंग निर्देशिकाओं या फ़ाइलों के बारे में जानता हूं, न ही इसमें हैडोप या एचडीएफएस के साथ बातचीत करने के लिए विशिष्ट सुविधाएं हैं। Pyspark: get list of files/directories on HDFS path

बार जब आप एक निर्देशिका में फ़ाइलों की सूची है, यह अगर एक विशेष फ़ाइल मौजूद जांच करने के लिए आसान है:

वैसे भी, यह एक संबंधित सवाल करने के लिए अपने जवाब है।

मुझे उम्मीद है कि यह किसी भी तरह से मदद कर सकता है।

0

क्या आपने pydoop का उपयोग करने का प्रयास किया है? exists फ़ंक्शन को काम करना चाहिए

0

एक संभावना यह है कि आप सभी पथ प्राप्त करने के लिए hadoop fs -lsr your_path का उपयोग कर सकते हैं और फिर जांच कर सकते हैं कि आप जिस मार्ग में रुचि रखते हैं उसमें हैं।

आपके दुर्घटना के संबंध में, यह संभव है कि यह os.system पर सभी कॉल का परिणाम था, जो हैडऑप कमांड के विशिष्ट होने के बजाय। कभी-कभी बाहरी प्रक्रिया को कॉल करने से बफर से संबंधित मुद्दे हो सकते हैं जो कभी जारी नहीं होते हैं, विशेष रूप से I/O बफर (stdin/stdout) में।

एक समाधान एक बैश स्क्रिप्ट के लिए एक कॉल करना होगा जो सभी पथों पर लूप करता है। आप अपने कोड में स्ट्रिंग टेम्पलेट का उपयोग करके स्क्रिप्ट बना सकते हैं, स्क्रिप्ट में पथों की सरणी भरें, इसे लिखें, फिर निष्पादित करें।

पाइथन के subprocess मॉड्यूल पर स्विच करना भी एक अच्छा विचार हो सकता है, जो आपको उपप्रोसेसेस को संभालने पर अधिक बारीक नियंत्रण प्रदान करता है।

process = subprocess.check_output(
     args=your_script, 
     stdout=PIPE, 
     shell=True 
    ) 

ध्यान दें कि आप एक फ़ाइल हैंडल की तरह कुछ करने के लिए stdout स्विच कर सकते हैं कि अगर डिबगिंग या प्रक्रिया को और अधिक मजबूत बनाने के साथ मदद करता है: यहाँ os.system के बराबर है। इसके अलावा आप False पर तर्क को तब तक स्विच कर सकते हैं जब तक कि आप एक वास्तविक स्क्रिप्ट नहीं कहें या पाइप या रीडायरेक्शन जैसे शैल-विशिष्ट चीजों का उपयोग न करें।