在pyspark中使用wholeTextFiles但得到内存不足的错误

时间:2016-03-28 07:56:20

标签: python apache-spark pyspark

我有一些文件(部分00000.gz,部分00001.gz,部分00002.gz,......),每个部分都相当大。我需要使用每个部分的文件名,因为它包含时间戳信息。据我所知,似乎在pyspark中只有wholeTextFiles可以读取输入(文件名,内容)。但是,当使用wholeTextFiles时,我得到内存不足的错误。因此,我的猜测是,整个文本文件在没有分区操作的情况下将整个部分读取为mapper中的内容。我也找到了这个答案(How does the number of partitions affect `wholeTextFiles` and `textFiles`?)。如果是这样,我怎么能得到一个相当大的部分文件的文件名。感谢

1 个答案:

答案 0 :(得分:2)

您收到错误,因为wholeTextFiles尝试将整个文件读入单个RDD。您最好逐行读取文件,只需编写自己的生成器并使用flatMap函数即可。这是example这样做来读取gzip文件:

import gzip
def read_fun_generator(filename):
    with gzip.open(filename, 'rb') as f:
        for line in f:
            yield line.strip()

gz_filelist = glob.glob("/path/to/files/*.gz")
rdd_from_bz2 = sc.parallelize(gz_filelist).flatMap(read_fun_generator)