PySpark'ta dosyaları ayrıştırmak için ek bir yararlı yol buldum. Belki de Scala'da bir eşdeğeri var, ama çalışan bir çeviri bulmakta yeterince rahat değilim. Aslında, etiketlerin eklenmesiyle bir textFile çağrısıdır (aşağıdaki örnekte anahtar = dosyaadı, değer = dosyadan 1 satır).
"Etiketli" textFile
giriş:
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)
output: her girdinin anahtar olarak dosyaadı kullanarak bir demet içeren ve value = her dosya satırı ile dizi. (Teknik olarak, bu yöntemi kullanarak, gerçek dosya yolu adının yanı sıra belki de belleğe kaydetmek için karma bir temsil dışında farklı bir anahtar da kullanabilirsiniz). yani.
[('/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'),
...]
Ayrıca bir satır listesi olarak da yeniden birleştirebilirsiniz:
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'])]
Veya tüm dosyaları tek bir dizeye geri birleştirin (bu örnekte sonuç wholeTextFiles ile elde ettiğinizle aynıdır, ancak "file:" dizesi dosya yolundan çıkarılmıştır.):
Spark_Full.groupByKey().map(lambda x: (x[0], ' '.join(list(x[1])))).collect()
Path
seçenekler geçerlidir.