Dans PySpark, j'ai trouvé un moyen utile supplémentaire pour analyser les fichiers. Il existe peut-être un équivalent dans Scala, mais je ne suis pas assez à l'aise pour proposer une traduction fonctionnelle. Il s'agit en fait d'un appel textFile avec l'ajout d'étiquettes (dans l'exemple ci-dessous, la clé = nom de fichier, valeur = 1 ligne du fichier).
TextFile "étiqueté"
contribution:
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)
sortie: tableau avec chaque entrée contenant un tuple utilisant filename-as-key et avec valeur = chaque ligne de fichier. (Techniquement, en utilisant cette méthode, vous pouvez également utiliser une clé différente en plus du nom de chemin de fichier réel - peut-être une représentation de hachage à enregistrer sur la mémoire). c'est à 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'),
...]
Vous pouvez également recombiner soit sous forme de liste de lignes:
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'])]
Ou recombinez des fichiers entiers en chaînes uniques (dans cet exemple, le résultat est le même que celui que vous obtenez de wholeTextFiles, mais avec la chaîne "file:" supprimée du chemin de fichier.):
Spark_Full.groupByKey().map(lambda x: (x[0], ' '.join(list(x[1])))).collect()
Path
options s'appliquent.