2016-03-02 9 views
8

पर फ़ाइलों/निर्देशिकाओं की सूची प्राप्त करें। मुझे टेक्स्टफाइल के बारे में पता है लेकिन जैसा कि नाम से पता चलता है, यह केवल टेक्स्ट फ़ाइल पर काम करता है। मुझे एचडीएफएस (या स्थानीय पथ) पर पथ के अंदर फ़ाइलों/निर्देशिकाओं तक पहुंचने की आवश्यकता होगी। मैं pyspark उपयोग कर रहा हूँPyspark: शीर्षक में एचडीएफएस पथ

मदद

उत्तर

10

मेरा मानना ​​है कि डेटा को लोड करने से शुरू होने वाले डोमेन के साथ स्पार्क को केवल डेटा प्रोसेसिंग टूल के रूप में सोचना उपयोगी होता है। यह कई प्रारूपों को पढ़ सकता है, और यह हैडोप ग्लोब एक्सप्रेशन का समर्थन करता है, जो एचडीएफएस में कई पथों से पढ़ने के लिए बहुत उपयोगी हैं, लेकिन इसमें एक अंतर्निहित सुविधा नहीं है जिसे मैं ट्रैवर्सिंग निर्देशिकाओं या फ़ाइलों के बारे में जानता हूं, और न ही यह है हडोप या एचडीएफएस के साथ बातचीत करने के लिए विशिष्ट उपयोगिताओं।

esutil और hdfs सहित, जो कुछ भी आप चाहते हैं, करने के लिए कुछ उपलब्ध टूल हैं। एचडीएफएस lib सीएलआई और एपीआई दोनों का समर्थन करता है, आप सीधे पाइथन में एचडीएफएस फाइलों को कैसे सूचीबद्ध कर सकते हैं 'here। यह इस तरह दिखता है:

from hdfs import Config 
client = Config().get_client('dev') 
files = client.list('the_dir_path') 
+0

हाय, क्या आप कृपया मुझे यह सलाह दे सकते हैं कि hdfscli.cfg फ़ाइल कैसे बनाएं, मुझे नहीं पता कि पोर्ट नंबर क्या है। [वैश्विक] default.alias = देव [dev.alias] url = http: //dev.namenode: बंदरगाह उपयोगकर्ता = एन –

1

के लिए धन्यवाद आप एक निर्देशिका में सभी फाइलों में पढ़ने के लिए चाहते हैं, sc.wholeTextFiles[doc] की जाँच, लेकिन ध्यान दें कि फ़ाइल की सामग्री एक ही पंक्ति के मान में पढ़ रहे हैं , जो शायद वांछित परिणाम नहीं है।

आप तो रास्तों की सूची तैयार (एक सामान्य HDFS ls कमांड के प्रयोग के साथ साथ जो कुछ भी आप की जरूरत को छानने) है और यह sqlContext.read.text[doc] में गुजर और फिर एक DataFrame के लिए एक RDD से परिवर्तित केवल कुछ फ़ाइलों को पढ़ने के लिए, चाहते हैं की तरह लगता है सर्वोत्तम दृष्टिकोण

14

का उपयोग JVM प्रवेश द्वार हो सकता है तो सुंदर नहीं है, लेकिन कुछ मामलों में नीचे दिए गए कोड उपयोगी हो सकता है:

URI   = sc._gateway.jvm.java.net.URI 
Path   = sc._gateway.jvm.org.apache.hadoop.fs.Path 
FileSystem = sc._gateway.jvm.org.apache.hadoop.fs.FileSystem 
Configuration = sc._gateway.jvm.org.apache.hadoop.conf.Configuration 


fs = FileSystem.get(URI("hdfs://somehost:8020"), Configuration()) 

status = fs.listStatus(Path('/some_dir/yet_another_one_dir/')) 

for fileStatus in status: 
    print fileStatus.getPath() 
+1

उपयोग '' बजाय fileStatus' की globStatus' यदि आप परिणामों को फ़िल्टर करना चाहते हैं उदाहरण के लिए 'स्थिति = fs.globStatus (पथ ('/ some_dir/yet_another_one_dir/*।सीएसवी ')) ' –

+0

यह काफी अच्छा है क्योंकि मुझे स्पार्क-सबमिट करने के लिए अतिरिक्त पुस्तकालय अपलोड करने की आवश्यकता नहीं है। –

+0

इस उत्तर के लिए धन्यवाद। – Tony

5

आप PySpark का उपयोग करते हैं, तो आप सहभागी आदेश पर अमल कर सकते हैं :


सूची एक चुने हुए निर्देशिका से सभी फाइलों:

hdfs dfs -ls <path> जैसे: hdfs dfs -ls /user/path: एक चुने हुए निर्देशिका में

import os 
import subprocess 

cmd = 'hdfs dfs -ls /user/path'.split() 
files = subprocess.check_output(cmd).strip().split('\n') 
for path in files: 
    print path 

या खोज फ़ाइलें:

hdfs dfs -find <path> -name <expression> जैसे: hdfs dfs -find /user/path -name *.txt:

import os 
import subprocess 

cmd = 'hdfs dfs -find {} -name *.txt'.format(source_dir).split() 
files = subprocess.check_output(cmd).strip().split('\n') 
for path in files: 
    filename = path.split(os.path.sep)[-1].split('.txt')[0] 
    print path, filename 
+0

हाय फ़ाइलें = subprocess.check_output (cmd_find) .strip() विभाजित ('\ n') फ़ाइलें = subprocess.check_output (cmd) .strip()। विभाजन ('\ n') मैंने संपादन करने की कोशिश की लेकिन एसओ ने कहा कि संपादन 6 से अधिक परिवर्तन होना चाहिए। –

0

ऐसा करने के लिए एक आसान तरीका नहीं है सांपबाइट लाइब्रेरी का उपयोग

from snakebite.client import Client 

hadoop_client = Client(HADOOP_HOST, HADOOP_PORT, use_trash=False) 

for x in hadoop_client.ls(['/']): 

...  print x