Adjuntar nombre de archivo a RDD

Tengo una carpeta que contiene mis archivos de datos. Cada archivo tiene un tamaño de aproximadamente 1 GB.

Lo que necesito es el nombre de archivo dentro del RDD.

Lo siguiente no funciona como se esperaba:

import glob rdds = [] for filename in glob.iglob('/data/*'): rdd = sc.textFile(filename).map(lambda row: (filename, row)) rdds.append(rdd) allData = sc.union(rdds) 

Usando esto, el filename es siempre el nombre del último archivo leído.

Lo que también probé:

 import glob rdds = [] for filename in glob.iglob('/data/*'): def f(name=filename): return name rdd = sc.textFile(filename).map(lambda row: (f(), row)) rdds.append(rdd) allData = sc.union(rdds) 

Pero eso produce el error: la Broadcast can only be serialized in driver

sc.wholeTextFile() no es una opción porque los archivos individuales son demasiado grandes.

Supongo que quieres algo como esto:

 import functools def proc(f): return sc.textFile(f).map(lambda x: (f, x)) rdd = functools.reduce( lambda rdd1, rdd2: rdd1.union(rdd2), (proc(f) for f in glob.glob("/data/*"))) 

o con sc.union :

 sc.union([proc(f) for f in glob.glob("/data/*")])