Trong PySpark, tôi đã tìm thấy một cách hữu ích khác để phân tích các tệp. Có lẽ có một tương đương trong Scala, nhưng tôi không đủ thoải mái để đưa ra một bản dịch làm việc. Trên thực tế, đó là một cuộc gọi textFile với việc thêm nhãn (trong ví dụ dưới đây là key = filename, value = 1 dòng từ tệp).
TextFile "được gắn nhãn"
đầu vào:
import glob
from pyspark import SparkContext
SparkContext.stop(sc)
sc = SparkContext("local","example") # if running locally
sqlContext = SQLContext(sc)
for filename in glob.glob(Data_File + "/*"):
Spark_Full += sc.textFile(filename).keyBy(lambda x: filename)
đầu ra: mảng với mỗi mục chứa một tuple bằng cách sử dụng tên tệp-as-key và với value = mỗi dòng tệp. (Về mặt kỹ thuật, sử dụng phương pháp này, bạn cũng có thể sử dụng một khóa khác bên cạnh tên filepath thực tế - có lẽ là biểu diễn băm để lưu vào bộ nhớ). I E.
[('/home/folder_with_text_files/file1.txt', 'file1_contents_line1'),
('/home/folder_with_text_files/file1.txt', 'file1_contents_line2'),
('/home/folder_with_text_files/file1.txt', 'file1_contents_line3'),
('/home/folder_with_text_files/file2.txt', 'file2_contents_line1'),
...]
Bạn cũng có thể kết hợp lại dưới dạng danh sách các dòng:
Spark_Full.groupByKey().map(lambda x: (x[0], list(x[1]))).collect()
[('/home/folder_with_text_files/file1.txt', ['file1_contents_line1', 'file1_contents_line2','file1_contents_line3']),
('/home/folder_with_text_files/file2.txt', ['file2_contents_line1'])]
Hoặc kết hợp lại toàn bộ các tệp trở lại các chuỗi đơn (trong ví dụ này, kết quả giống như những gì bạn nhận được từ WholeTextFiles, nhưng với chuỗi "tệp:" bị tước khỏi filepathing.):
Spark_Full.groupByKey().map(lambda x: (x[0], ' '.join(list(x[1])))).collect()
Path
tùy chọn tương tự đều được áp dụng.