Чтение большого CSV-файла и его разбиение, приводящее к ошибке OOM - PullRequest
0 голосов
/ 24 марта 2020

Привет, я создаю задание GLUE, которое будет читать файл csv, а затем разбивать его по определенному столбцу, к сожалению, это вызывает ошибку OOM(Out of Memory) Пожалуйста, смотрите код ниже

import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import boto3


#get date 
Current_Date = datetime.now() - timedelta(days=1)
now = Current_Date.strftime('%Y-%m-%d')

#get date
Previous_Date = datetime.now() - timedelta(days=2)
prev = Previous_Date.strftime('%Y-%m-%d')

#read csv file that contain today's date
filepath = "s3://bucket/file"+now+".csv.gz"

data = pd.read_csv(filepath, sep='|', header=None,compression='gzip') 

#   count no. of loops
loop = 0
for i, x in data.groupby(data[10].str.slice(0,10)):
    loop += 1

# if no. of distinct values of column 10 (last_update) is greater than or equal to 7
if loop >= 7:
    #run loop for the dataframe and split by distinct values of column 10 (last_update)
    for i, x in data.groupby(data[10].str.slice(0, 10)):
        x.to_csv("s3://bucket/file.csv.gz".format(i.lower()),header=None,compression='gzip')

#if no. of distinct values of column 10 (last_update) is less than 7
#filter dateframe (current date and previous date); new dataframe is created
else:
    d = data[(data[10].str.slice(0,10)==prev)|(data[10].str.slice(0,10)==now)]
#run loop for the filtered data frame and split by distinct values of column 10 (last_update)
 for i, x in d.groupby(d[10].str.slice(0, 10)):
        x.to_csv("s3://bucket/file.csv.gz".format(i.lower()),header=None,compression='gzip')

РЕШЕНИЕ - Я решил эту проблему, увеличив максимальную емкость работы с клеем

1 Ответ

0 голосов
/ 02 апреля 2020

Не уверен, насколько велик размер вашего файла, но если вы разделите файл на куски, вы сможете избежать ошибки. Мы успешно протестировали файл размером 2,5 ГБ, используя этот метод. Также, если вы используете оболочку python, не забудьте обновить максимальную емкость работы клея до 1

data = pd.read_csv(filepath, chunksize=1000, iterator=True) 
for chunk in enumerate(data):
#Loop through the chunks and process the data
...