如何用pyspark跳过损坏的gzips?

时间:2016-04-25 10:13:44

标签: apache-spark pyspark

我需要从hdfs中读取很多gzip,如下所示: sc.textFile(' *。GZ') 虽然其中一些gzips已损坏,但会引发

  

java.io.IOException:gzip stream CRC失败

停止整个处理过程。

我阅读了辩论here,其中有人有同样的需求,但没有明确的解决方案。由于它不适合在spark中实现此功能(根据链接),是否有任何方法只是粗暴地跳过损坏的文件?似乎有scala用户的提示,不知道如何在python中处理它。

或者我只能先检测损坏的文件,然后删除它们?

如果我有大量的gzip怎么办?经过一天的运行后,发现它们中的最后一个已经损坏了。整整一天都浪费了。已经损坏的gzips很常见。

1 个答案:

答案 0 :(得分:0)

您可以手动列出所有文件,然后读取地图UDF中的文件。然后,UDF可以使用try / except块来处理损坏的文件。

代码看起来像

import gzip
from pyspark.sql import Row

def readGzips(fileLoc):
    try:
        ...
        code to read file
        ...
        return record
    except:
        return Row(failed=fileLoc)

from os import listdir
from os.path import isfile, join
fileList = [f for f in listdir(mypath) if isfile(join(mypath, f))]

pFileList = sc.parallelize(fileList)
dataRdd = pFileList.map(readGzips).filter((lambda x: 'failed' not in x.asDict()))