En PySpark, he encontrado una forma útil adicional de analizar archivos. Quizás haya un equivalente en Scala, pero no me siento lo suficientemente cómodo como para encontrar una traducción que funcione. Es, en efecto, una llamada textFile con la adición de etiquetas (en el ejemplo a continuación, la clave = nombre de archivo, valor = 1 línea del archivo).
Archivo de texto "etiquetado"
entrada:
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)
salida: matriz con cada entrada que contiene una tupla usando filename-as-key y con value = cada línea de archivo. (Técnicamente, con este método también puede usar una clave diferente además del nombre real de la ruta del archivo, tal vez una representación hash para guardar en la memoria). es decir.
[('/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'),
...]
También puede recombinarse como una lista de líneas:
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 recombine archivos completos de nuevo a cadenas individuales (en este ejemplo, el resultado es el mismo que el que obtiene de wholeTextFiles, pero con la cadena "file:" eliminada de la ruta de archivo):
Spark_Full.groupByKey().map(lambda x: (x[0], ' '.join(list(x[1])))).collect()
Path
que se aplican las mismas opciones.