我有成千上万个zip文件,其中包含一个带有单个csv的文件夹。如下:
这个想法是,我需要在特定的一天/小时内同时加载所有文件,并在Spark中创建一个DataFrame,连接这些文件并进行一些转换,然后再将其保存为另一个csv文件。
所以基本上我想这样读取数据:
spark.read.csv('/raw/14082018*')
但是,我似乎找不到正确的方法(简洁?),我目前正在执行以下操作:
def zip_extract(x):
in_memory_data = BytesIO(x[1])
file_obj = zipfile.ZipFile(in_memory_data, "r")
files = [i for i in file_obj.namelist()]
return dict(zip(files, [file_obj.open(file).read() for file in files]))
df_list = list()
for file in file_list:
binaries = sc.binaryFiles(file).map(zip_extract)
collection = binaries.collect()
df_list.append([pd.read_csv(StringIO(c[list(c.keys())[0]].decode('latin'))) for c in collection][0])
但这最终使我的内存混乱,并且我无法处理所有数据。
是否有一种方法可以使用Spark读取所有压缩文件并在转换/收集之前在节点之间分发它们?