이번 포스팅에서는 ” 파이썬으로 csv 파일을 parquet 파일로 변환하는 방법 ” 에 대해서 알아 보겠습니다. parquet 파일에 대한 자세한 내용은 빅데이터 처리를 위한 Parquet(파케이) 파일 형식 알아보기 포스팅 글을 참고하시면 됩니다. 실습에 활용할 데이터는 Fake Data 생성 포스팅에서 생성한 데이터를 활용하겠습니다.
csv 파일을 parquet 파일로 변환하는 최종 파이썬 코드
pip install pyarrow # 이미 pyarrow 라이브러리가 설치되어 있다면, 생략하셔도 됩니다.
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq
csvFile = "D:/빅데이터처리 실습용 Fake Data.csv"
parquetFile = "D:/fakeData.parquet"
chunksize = 200000
csvStream = pd.read_csv(csvFile, sep=',', chunksize = chunksize, low_memory=False)
chunk = next(iter(csvStream))
# 처음 100000개의 데이터를 활용하여 CSV 파일의 스키마 추정
parquetSchema = pa.Table.from_pandas(df = chunk).schema
# 만약, 데이터의 스키마를 미리 알고 있다면, 미리 지정해 주는 것이 좋습니다.
# parquetSchema = pa.schema([
# ('변수명1', 형식1), -> 예시: ('var1', pa.int64()),
# ('변수명2', 형식2), -> 예시: ('var2', pa.string()),
# ...
# ('변수명n', 형식n)
# ])
# CSV 파일을 청크 단위로 가져오기
chunksize = 50000
csvStream = pd.read_csv(csvFile, sep=',', chunksize = chunksize, low_memory = False)
for i, chunk in enumerate(csvStream):
print("Chunk", i)
if i == 0:
# 데이터를 쓰기 위한 파케이(parquet) 파일 열기
parquetWriter = pq.ParquetWriter(where = parquetFile, schema = parquetSchema, compression = 'snappy')
# 청크로 가져온 csv 파일을 파케이(parquet) 파일로 쓰기
table = pa.Table.from_pandas(chunk, schema = parquetSchema)
parquetWriter.write_table(table)
# 파케이(parquet) 파일 닫기
parquetWriter.close()
위의 코드를 실행하면, D드라이브에 “fakeData” 파일명을 가지는 paquet(파케이) 파일이 생성됩니다. paquet(파케이) 파일은 열 기반으로 데이터를 압축하여 저장하므로, 기존 CSV 파일과 비교해 보았을 때, 용량이 40% 줄어들었습니다.
csv 파일을 parquet 파일로 변환하는 파이썬 코드 상세 설명
파이썬 최종 코드의 의미를 자세히 살펴 보겠습니다.
- 1번 라인
- pyarrow 패키지를 설치합니다.
- 만약, 이미 pyarrow 패키지가 설치되어 있다면, 생략하셔도 됩니다. .
- 3번 ~ 5번 라인
- csv 파일을 불러오고, parquet 파일을 생성하는 데 필요한 패키지를 사용하기 위해 임포트합니다.
- 8번 라인
- csv 파일이 저장되어 있는 경로명과 csv 파일명을 csvFile 객체에 저장합니다.
- 9번 라인
- 생성할 paquet 파일명과 저장하고자 하는 경로를 paquetFile 객체에 저장합니다.
- 10번 라인
- csv 파일에서 스키마 추정을 위해 한번에 읽어 드릴 데이터 건수를 100000건으로 정의하고, 이를 chunksize 객체에 저장합니다.
- 11번 라인
- pandas 라이브러리의 read_csv() 함수를 사용하여 csv 파일의 데이터를 메모리에 로드합니다.
- sep=’,’ : 데이터의 구분자 ‘,’ 를 정의합니다.
- chunksize = chunksize(50000) : 한번에 읽어드릴 데이터 건수를 정의합니다.
- low_memory = False : 파일을 청크(chunk)로 처리하여 구문 분석을 하면, 메모리 사용량을 줄일 수 있습니다. 하지만 혼합된 데이터 유형에 대해서는 추론을 해야 하는 상황이 발생할 수 있습니다. 혼합된 데이터 유형이 발생하지 않도록 하려면 False로 설정합니다.
- 12번 라인
- 스키카 추정을 위해 처음 chunk로 읽어들인 데이터를 데이터프레임의 형태로 chunk 객체에 저장합니다.
- 15번 라인
- 앞서 생성한 200,000건의 데이터를 가지는 데이터프레임으로, CSV 파일의 스키마를 정의한 후 parquetSchema 객체에 저장합니다.
- 만약, 데이터의 스키마를 미리 알고 있다면, 18번 라인 ~ 23번 라인을 참고하여 스키마를 지정합니다.
- 26 ~ 27번 라인
- 데이터를 한번에 읽어들일 크기를 50,000개로 설정하여 메모리에 올립니다.
- 29 ~ 38번 라인
- chunk 개수 만큼 반복하면서 30번 ~ 38번 라인을 실행합니다.
- 30번 라인 : 반복되는 chunk의 개수를 출력합니다.
- 31 ~ 35번 라인: 스키마와 압축형식, 생성하고자 하는 parquet 파일의 저장경로와 파일명을 정의하고, parquet 파일에 쓰기 위한 준비를 마칩니다.
- 30 ~ 31번 라인: chunk로 가져온 데이터를 parquet 파일에 쓰기 시작합니다.
- 35번 라인
- 최종 paquet 파일을 닫고, paquet 파일 생성을 완료합니다.
이상으로 ” csv 파일을 parquet 파일로 변환하는 방법 “에 대해서 살펴 보았습니다.