我需要从hdfs中读取很多gzip,如下所示: sc.textFile(' *。GZ') 虽然其中一些gzips已损坏,但会引发
java.io.IOException:gzip stream CRC失败
停止整个处理过程。
我阅读了辩论here,其中有人有同样的需求,但没有明确的解决方案。由于它不适合在spark中实现此功能(根据链接),是否有任何方法只是粗暴地跳过损坏的文件?似乎有scala用户的提示,不知道如何在python中处理它。
或者我只能先检测损坏的文件,然后删除它们?
如果我有大量的gzip怎么办?经过一天的运行后,发现它们中的最后一个已经损坏了。整整一天都浪费了。已经损坏的gzips很常见。
答案 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()))