In PySpark, ho trovato un modo utile aggiuntivo per analizzare i file. Forse c'è un equivalente in Scala, ma non mi sento abbastanza a mio agio nel trovare una traduzione funzionante. È, in effetti, una chiamata textFile con l'aggiunta di etichette (nell'esempio seguente la chiave = nomefile, valore = 1 riga dal file).
File di testo "con etichetta"
ingresso:
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 con ogni voce contenente una tupla usando il nome file come chiave e con valore = ogni riga del file. (Tecnicamente, usando questo metodo puoi anche usare una chiave diversa oltre al nome del percorso del file, forse una rappresentazione di hashing per salvare in memoria). vale a dire.
[('/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'),
...]
Puoi anche ricombinare come un elenco di righe:
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'])]
O ricombina interi file in singole stringhe (in questo esempio il risultato è lo stesso di quello che ottieni da interiTextFile, ma con la stringa "file:" rimossa dal percorso dei file.):
Spark_Full.groupByKey().map(lambda x: (x[0], ' '.join(list(x[1])))).collect()
Path
applicano tutte le stesse opzioni.