如何在pyspark中读取大型zip文件

时间:2019-03-28 14:29:05

标签: python pyspark amazon-emr

我在s3上确实有n个.zip文件,我想对其进行处理并从中提取一些数据。 zip文件包含一个json文件。在spar中,我们可以读取.gz文件,但找不到任何方法来读取.zip文件中的数据。有人可以帮我解决如何使用python通过spark处理大型zip文件。我遇到过诸如newAPIHadoopFile之类的一些选项,但是并没有遇到任何运气,也没有找到在pyspark中实现它们的方法。请注意,zip文件的大小> 1G,有些也为20G。

下面是我使用的代码:

import zipfile
import io
file_name = "s3 file path for zip file"

def zip_extract(x):
    in_memory_data = io.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]))


zips = sc.binaryFiles(file_name)
files_data = zips.map(zip_extract)

但是由于以下原因而失败。我正在使用的实例是r42x.large。

Exit code: 52
Stack trace: ExitCodeException exitCode=52: 
Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.runJob.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0

1 个答案:

答案 0 :(得分:0)

我确实读取了大块zip文件的内容,并使用spark处理了这些大块。这对我有用,并帮助我阅读了大小超过10G的zip文件。下面是示例集:

max_data_length=10000
z = zipfile.ZipFile(zip_file)
data = []
counter=1
with z.open(z.infolist()[0]) as f:
    line_counter=0
    for line in f:
        # Append file contents to list
        data.append(line)
        line_counter=line_counter+1
        # Reset counters if record count hit max-data-length threshold
        # Create spark dataframes
        if not line_counter % max_data_length:          
            # Spark processing like:
            df_rdd = spark.sparkContext.parallelize(data)

            # Reset Counters and data-list
            counter=counter+1
            line_counter=0
            data= []