Data Engineering/실습

Parquet 파일 형식

qqprty 2024. 7. 26. 15:17

1. Parquet?

Parquet이란 하둡에서 칼럼방식으로 저장하는 저장 포맷이다. 

 

 

열을 기반으로 데이터를 처리하면 행 기반으로 압축할때보다 다음과 같은 장점을 가진다.

 

1. 데이터 압축률이 더 높음 : 같은 속성값을 가지는 칼럼 단위로 구성하면 데이터가 더 균일하기 때문

2. 필요한 열의 데이터만 읽어서 처리 : 데이터 처리에 들어가는 지원 절약 (선택되지 않은 칼럼 I/O 발생하지 않기 때문)

3. 칼럼에 동일한 데이터 타입이 저장되기 때문에, 칼럼별로 적합한 인코딩 사용 가능

 

 

즉, parquet 형식을 사용하면 시간과 메모리를 절약할 수 있다.

 

출처: https://butter-shower.tistory.com/245

2. Parquet 실습

CSV 파일을 읽어 데이터 전처리를 수행한 후, 특정 키워드를 포함한 행을 필터링하고, 그 행들의 'cnt' 열 값의 합계를 계산한 뒤, 데이터를 Parquet 형식으로 저장하는 작업

 

1. csv 파일 데이터 불러오기

import pandas as pd
df = pd.read_csv('~/data/csv/20240717/csv.csv', names=['dt', 'cmd', 'cnt'])
df

 

 

 

 

2. str.replace()

 

history log데이터를 csv 파일로 변환할 때, 필드를 구별하기 위해  ^로 둘러쌓아뒀다. 이를 공백으로 치환하여 보기 편하게 없애준다.

df['dt']=df['dt'].str.replace('^', '')
df['cmd']=df['cmd'].str.replace('^', '')
df['cnt']=df['cnt'].str.replace('^', '')
df

 

 

3. 데이터 타입 변환, 필터링, 연산 

df['cnt']=df['cnt'].astype(int) #cnt열의 데이터 타입을 정수형으로 변환
fdf = df[df['cmd'].str.contains('<키워드>')] #cmd열에서 특정 <키워드>를 포함한 행을 필터링하여 'fdf'에 저장
cnt=fdf['cnt'].sum() #'fdf' 의 'cnt' 열 값의 합계 계산
print(cnt)
df.to_parquet("~/tmp/history.parquet") #'df'를 parquet 형식으로 저장

 

 

3. 실습코드 변형

 

1. 검색하고 싶은 키워드를 입력받아 출력해주는 코드

더보기
import pandas as pd
import sys
def cnt():
    df = pd.read_parquet("~/tmp/history.parquet")
    keyword=sys.argv[1]
    fdf = df[df['cmd'].str.contains(keyword)]
    cnt = fdf['cnt'].sum()
    print(cnt)

2.  특정 날짜에 가장많이 쓰인 10가지 명령어 출력해주는 코드

더보기
import pandas as pd
df = pd.read_parquet('~/data/parquet')
fdf=df[df['dt']=='<날짜>']
ddf=fdf.sort_values(by='cnt', ascending=False) #cnt을 기준으로 내림차순 정렬
sdf=ddf.drop(columns=['dt']) #의미없는 dt 컬럼 삭제
print(sdf.to_string(index=False)) #문자열로 변환하고, 결과값 출력