2015-10-28 8 views
14

मैं स्केल/स्पार्क का उपयोग कर एक एचडीएफएस निर्देशिका के भीतर सभी फ़ोल्डरों को सूचीबद्ध करना चाहता हूं। Hadoop में मैं आदेश का उपयोग करके ऐसा कर सकते हैं: hadoop fs -ls hdfs://sandbox.hortonworks.com/demo/निर्देशिका में स्पार्क स्कैला सूची फ़ोल्डर्स

मैं के साथ इसे करने की कोशिश:

val conf = new Configuration() 
val fs = FileSystem.get(new URI("hdfs://sandbox.hortonworks.com/"), conf) 

val path = new Path("hdfs://sandbox.hortonworks.com/demo/") 

val files = fs.listFiles(path, false) 

लेकिन यह प्रतीत नहीं होता है कि वह Hadoop निर्देशिका में लगता है जैसे मैं अपने फ़ोल्डर्स/फ़ाइलें नहीं मिल रहा।

मैं भी साथ की कोशिश की:

FileSystem.get(sc.hadoopConfiguration).listFiles(new Path("hdfs://sandbox.hortonworks.com/demo/"), true) 

लेकिन यह भी मदद नहीं करता है।

क्या आपके पास कोई अन्य विचार है?

पीएस: मैंने यह धागा भी देखा: Spark iterate HDFS directory लेकिन यह मेरे लिए काम नहीं करता है क्योंकि यह केवल hdma निर्देशिका पर खोज नहीं प्रतीत होता है, बल्कि स्कीमा फ़ाइल // के साथ स्थानीय फ़ाइल सिस्टम पर।

उत्तर

20

हम hadoop 1.4 का उपयोग कर रहे हैं और इसमें सूचीफाइल विधि नहीं है इसलिए हम निर्देशिका प्राप्त करने के लिए सूचीस्टैटस का उपयोग करते हैं। इसमें रिकर्सिव विकल्प नहीं है लेकिन रिकर्सिव लुकअप को प्रबंधित करना आसान है।

val fs = FileSystem.get(new Configuration()) 
val status = fs.listStatus(new Path(YOUR_HDFS_PATH)) 
status.foreach(x=> println(x.getPath)) 
+2

धन्यवाद एक बहुत है अपने उपनिर्देशिका org.apache.hadoop.fs.LocatedFileStatus से अधिक, listStatus ज्यादा फ़ोल्डरों प्राप्त करने के लिए बेहतर है और अच्छी तरह से काम करता है! मेरे मामले में मुझे एक रिकर्सिव लुकअप की आवश्यकता नहीं है, इसलिए यह बिल्कुल ठीक है। ** एक जोड़ा **: जब मैं आपके कोडिंग का उपयोग कर रहा हूं, फाइल सिस्टम स्कीमा फ़ाइल है: // और मैं hdfs: // स्कीमा के रूप में उपयोग नहीं कर सकता। इसलिए मैंने फाइल सिस्टम को इस तरह बनाया: 'वैल conf = नया कॉन्फ़िगरेशन() वैल fs = FileSystem.get (नया यूआरआई ("hdfs: //sandbox.hortonworks.com/"), conf)। फिर फाइल सिस्टम एचडीएफएस: // पथ स्वीकार करता है। – AlexL

0

क्योंकि आप स्काला का उपयोग कर रहे हैं, आप भी में रुचि हो सकती है:

import scala.sys.process._ 
val lsResult = Seq("hadoop","fs","-ls","hdfs://sandbox.hortonworks.com/demo/").!! 

हो जाएगा ताकि, दुर्भाग्य से, आदेश के पूरे उत्पादन लौट स्ट्रिंग के रूप है, और इसलिए नीचे पार्स करने केवल फाइलनामों के लिए कुछ प्रयास की आवश्यकता है। (इसके बजाय fs.listStatus का उपयोग करें।) लेकिन यदि आपको खुद को अन्य कमांड चलाने की आवश्यकता है, जहां आप आसानी से कमांड लाइन में ऐसा कर सकते हैं और यह सुनिश्चित नहीं है कि स्कैला में इसे कैसे किया जाए, तो scala.sys.process._ के माध्यम से कमांड लाइन का उपयोग करें। HDFS की (एक ! का उपयोग करें तो आप सिर्फ वापसी कोड प्राप्त करना चाहते हैं।)

3
val listStatus = org.apache.hadoop.fs.FileSystem.get(new URI(url), sc.hadoopConfiguration) 
.globStatus(new org.apache.hadoop.fs.Path(url)) 

    for (urlStatus <- listStatus) { 
    println("urlStatus get Path:" + urlStatus.getPath()) 

}

0

मैं एक ही लिए देख रहा था, हालांकि इसके बजाय, S3 के लिए।

मैं नीचे के रूप में मेरी S3 पथ के साथ FileSystem बनाने हल:

def getSubFolders(path: String)(implicit sparkContext: SparkContext): Seq[String] = { 
    val hadoopConf = sparkContext.hadoopConfiguration 
    val uri = new URI(path) 

    FileSystem.get(uri, hadoopConf).listStatus(new Path(path)).map { 
     _.getPath.toString 
    } 
    } 

मैं जानता हूँ कि इस सवाल का HDFS के लिए संबंधित था, लेकिन शायद मेरे जैसे दूसरों को यहाँ S3 समाधान की तलाश में आ जाएगा। चूंकि फाइलसिस्टम में यूआरआई निर्दिष्ट किए बिना, यह एचडीएफएस के लिए देखेगा।

java.lang.IllegalArgumentException: Wrong FS: s3://<bucket>/dummy_path 
expected: hdfs://<ip-machine>.eu-west-1.compute.internal:8020 
0
object HDFSProgram extends App {  
    val uri = new URI("hdfs://HOSTNAME:PORT")  
    val fs = FileSystem.get(uri,new Configuration())  
    val filePath = new Path("/user/hive/")  
    val status = fs.listStatus(filePath)  
    status.map(sts => sts.getPath).foreach(println)  
} 

यह HDFS फाइल या/उपयोगकर्ता/छत्ता के तहत फ़ोल्डर वर्तमान की सूची प्राप्त करने नमूना कोड है/

-2

Azure ब्लॉग भंडारण एक HDFS स्थान पर मैप किया गया है, इसलिए सभी Hadoop संचालन

Azure Portal पर, भंडारण खाते में जाते हैं, आप निम्नलिखित विवरण मिल जाएगा:

  • संग्रहण खाता

  • कुंजी -

  • कंटेनर -

  • पथ पैटर्न -/उपयोगकर्ताओं/accountsdata/

  • दिनांक स्वरूप - yyyy-mm-dd

  • घटना क्रमबद्धता प्रारूप - जेसन

  • के लिए चटाई - रेखा से अलग

पथ पैटर्न यहाँ HDFS पथ है, तो आप प्रवेश कर सकते हैं/Hadoop एज नोड के लिए पोटीन और कार्य करें:

hadoop fs -ls /users/accountsdata 

आदेश से ऊपर सभी फाइलों को सूचीबद्ध करेगा। स्काला में आप

import scala.sys.process._ 

val lsResult = Seq("hadoop","fs","-ls","https://stackoverflow.com/users/accountsdata/").!! 
+0

कृपया उत्तर को अनदेखा करें - गलत धागे पर पोस्ट किया गया !!! –

0
val spark = SparkSession.builder().appName("Demo").getOrCreate() 
val path = new Path("enter your directory path") 
val fs:FileSystem = projects.getFileSystem(spark.sparkContext.hadoopConfiguration) 
val it = fs.listLocatedStatus(path) 

उपयोग कर सकते हैं यह एक इटरेटर पैदा करेगा it कि

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