SPARK:在压缩文件夹中加载CSV文件

时间:2018-08-14 22:39:16

标签: csv apache-spark pyspark zip

我有成千上万个zip文件,其中包含一个带有单个csv的文件夹。如下:

  • zip_folder_ddmmyyyyhhmmss.zip
    • folder_ddmmyyyyhhmmss
      • ddmmyyyyhhmmss.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读取所有压缩文件并在转换/收集之前在节点之间分发它们?

0 个答案:

没有答案