2014-11-19 16 views
16

Tôi có một thư mục gồm các thư mục trên HDFS và tôi muốn lặp qua các thư mục. Có cách nào dễ dàng để làm điều này với Spark bằng cách sử dụng đối tượng SparkContext không?Thư mục Spark lặp lại HDFS

+0

bạn có nghĩa là 'lặp' như có được danh sách các thư mục con và các tập tin bên trong? hoặc nhận tất cả các tệp trên tất cả các thư mục con? – maasg

+0

Lặp lại như trong danh sách tất cả các thư mục con. Mỗi thư mục con chứa một loạt các tệp văn bản mà tôi muốn xử lý theo các cách khác nhau. – Jon

Trả lời

30

Bạn có thể sử dụng org.apache.hadoop.fs.FileSystem. Cụ thể, FileSystem.listFiles([path], true)

Và với Spark ...

FileSystem.get(sc.hadoopConfiguration()).listFiles(..., true) 
+1

Hoàn hảo, cảm ơn. – Jon

+0

thực sự tốt đẹp! [Tôi có câu hỏi này] (http://stackoverflow.com/questions/34738296/spark-spark-submit-jars-arguments-wants-comma-list-how-to-declare-a-directory/35550151#35550151), được cấp, tôi đoán điều này sẽ không hoạt động trong lời gọi spark-submit ban đầu – JimLohse

+0

Làm cách nào để tạo danh sách các tệp bằng RemoteIterator này? – horatio1701d

5
import org.apache.hadoop.fs.{FileSystem,Path} 

FileSystem.get(sc.hadoopConfiguration).listStatus(new Path("hdfs:///tmp")).foreach(x => println(x.getPath)) 

này đã làm việc cho tôi.

Spark phiên bản 1.5.0-cdh5.5.2

2

Bạn có thể thử với tình trạng globStatus cũng

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()) 
} 
4

Dưới đây là phiên bản PySpark nếu ai đó đang quan tâm:

hadoop = sc._jvm.org.apache.hadoop 

fs = hadoop.fs.FileSystem 
conf = hadoop.conf.Configuration() 
path = hadoop.fs.Path('/hivewarehouse/disc_mrt.db/unified_fact/') 

for f in fs.get(conf).listStatus(path): 
    print f.getPath() 

Đặc biệt này trường hợp tôi nhận được danh sách của tất cả các tập tin tạo nên disc_mrt.unified_fact bảng Hive.

Các phương pháp khác của đối tượng FileStatus, như getLen() để có được kích thước tập tin được mô tả ở đây:

Class FileStatus

Các vấn đề liên quan