Di PySpark, saya telah menemukan cara tambahan yang berguna untuk mem-parsing file. Mungkin ada padanan dalam Scala, tapi saya tidak cukup nyaman dengan terjemahan yang berfungsi. Ini adalah, pada dasarnya, panggilan textFile dengan penambahan label (dalam contoh di bawah ini kunci = nama file, nilai = 1 baris dari file).
TextFile "berlabel"
memasukkan:
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: array dengan setiap entri yang berisi tuple menggunakan nama file-sebagai-kunci dan dengan nilai = setiap baris file. (Secara teknis, menggunakan metode ini Anda juga dapat menggunakan kunci yang berbeda di samping nama file sebenarnya - mungkin representasi hashing untuk menghemat memori). yaitu.
[('/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'),
...]
Anda juga dapat menggabungkan kembali baik sebagai daftar baris:
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'])]
Atau gabungkan kembali seluruh file kembali ke string tunggal (dalam contoh ini hasilnya sama dengan apa yang Anda dapatkan dari wholeTextFiles, tetapi dengan string "file:" yang dilepas dari filepathing.):
Spark_Full.groupByKey().map(lambda x: (x[0], ' '.join(list(x[1])))).collect()
Path
opsi yang sama berlaku.