๊ฐœ๋ฐœ Code/ํŒŒ์ด์ฌ Python

[Python][pandas] Parquet ํŒŒ์ผ ํฌ๋งท: ๊ณ ์† ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ์ตœ์ ํ™”๋œ ์ปฌ๋Ÿผ ์ €์žฅ ๋ฐฉ์‹

5hr1rnp 2025. 2. 19. 21:34
๋ฐ˜์‘ํ˜•

parquet

๋ฐ์ดํ„ฐ ๋ถ„์„๊ณผ ๋จธ์‹ ๋Ÿฌ๋‹์„ ํ•˜๋‹ค ๋ณด๋ฉด CSV, JSON, Excel ๋“ฑ์˜ ํŒŒ์ผ ํฌ๋งท์„ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ์†๋„์™€ ์ €์žฅ ํšจ์œจ์„ฑ์ด ์ค‘์š”ํ•œ๋ฐ, ์ด๋Ÿด ๋•Œ Parquet ํฌ๋งท์ด ๊ฐ•๋ ฅํ•œ ๋Œ€์•ˆ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.


1. Parquet๋ž€?


Apache Parquet๋Š” ์ปฌ๋Ÿผ ๊ธฐ๋ฐ˜ ์ €์žฅ ๋ฐฉ์‹(columnar storage format)์„ ์‚ฌ์šฉํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค ๋ฐ์ดํ„ฐ ํฌ๋งท์ž„. Hadoop ์ƒํƒœ๊ณ„์—์„œ ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ, ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์™€ ๋ถ„์„ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฐ ์ตœ์ ํ™”๋จ.

ํŠน์ง•

  • ์ปฌ๋Ÿผ ๊ธฐ๋ฐ˜ ์ €์žฅ(Columnar Storage)
    • CSV๋‚˜ JSON ๊ฐ™์€ ํฌ๋งท์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ–‰(Row) ๋‹จ์œ„๋กœ ์ €์žฅํ•˜์ง€๋งŒ, Parquet์€ ์ปฌ๋Ÿผ(Column) ๋‹จ์œ„๋กœ ์ €์žฅํ•จ
    • ํŠน์ • ์ปฌ๋Ÿผ๋งŒ ์ฝ์–ด๋„ ๋˜๋ฏ€๋กœ, ๋ถ„์„ ์†๋„๊ฐ€ ํ–ฅ์ƒ๋จ
  • ์••์ถ• ๋ฐ ์ธ์ฝ”๋”ฉ(Compression & Encoding)
    • ์ปฌ๋Ÿผ๋ณ„๋กœ ์••์ถ•์„ ์ ์šฉํ•˜์—ฌ ์ €์žฅ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ , ๋น ๋ฅธ ์ฝ๊ธฐ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•จ
    • ๊ธฐ๋ณธ์ ์œผ๋กœ Snappy, Gzip, LZO ๋“ฑ์˜ ์••์ถ• ๋ฐฉ์‹์„ ์ง€์›ํ•จ
  • ์Šคํ‚ค๋งˆ ์ €์žฅ(Schema Evolution)
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์Šคํ‚ค๋งˆ(๋ฐ์ดํ„ฐ ๊ตฌ์กฐ)๋ฅผ ํ•จ๊ป˜ ์ €์žฅํ•˜์—ฌ, ๋‹ค์–‘ํ•œ ์–ธ์–ด ๋ฐ ํˆด์—์„œ ์‰ฝ๊ฒŒ ํ™œ์šฉ ๊ฐ€๋Šฅํ•จ
  • ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
    • Spark, Pandas, Hadoop, Dask ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ตœ์ ํ™”๋˜์–ด ์‚ฌ์šฉ๋จ

2. Parquet vs CSV vs JSON


 

ํฌ๋งท ์ €์žฅ ๋ฐฉ์‹ ์••์ถ• ์ง€์› ์ฝ๊ธฐ ์„ฑ๋Šฅ ์“ฐ๊ธฐ ์„ฑ๋Šฅ ์šฉ๋Ÿ‰ ํšจ์œจ์„ฑ
CSV ํ–‰ ๊ธฐ๋ฐ˜ X ๋Š๋ฆผ ๋น ๋ฆ„ ๋น„ํšจ์œจ์ 
JSON ๊ณ„์ธตํ˜• O ๋Š๋ฆผ ๋Š๋ฆผ ์ค‘๊ฐ„
Parquet ์ปฌ๋Ÿผ ๊ธฐ๋ฐ˜ O ๋น ๋ฆ„ ์ค‘๊ฐ„ ํšจ์œจ์ 

 

๋น„๊ต ์š”์•ฝ

  • CSV: ํ…์ŠคํŠธ ํŒŒ์ผ์ด๋ผ ๊ฐ€๋…์„ฑ์ด ์ข‹์ง€๋งŒ, ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ ๋น„ํšจ์œจ์ ์ž„
  • JSON: ๊ณ„์ธตํ˜• ๊ตฌ์กฐ๋ผ ์œ ์—ฐ์„ฑ์ด ๋†’์ง€๋งŒ, ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๊ณ  ์†๋„๊ฐ€ ๋Š๋ ค์ง
  • Parquet: ์ปฌ๋Ÿผ ๋‹จ์œ„๋กœ ์ €์žฅํ•˜์—ฌ ์ฝ๊ธฐ ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ๋›ฐ์–ด๋‚˜๊ณ  ์šฉ๋Ÿ‰๋„ ํšจ์œจ์ ์ž„

728x90
๋ฐ˜์‘ํ˜•

3. Parquet ํŒŒ์ผ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• (Python)


Python์—์„œ pandas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Parquet ํŒŒ์ผ์„ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ.

3.1. ์„ค์น˜

Parquet ํฌ๋งท์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด pyarrow ๋˜๋Š” fastparquet ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•จ.

pip install pandas pyarrow fastparquet
 
3.2. ๋ฐ์ดํ„ฐ ์ €์žฅ

 

import pandas as pd

# ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
data = {
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [25, 30, 35],
    'city': ['Seoul', 'Busan', 'Incheon']
}

df = pd.DataFrame(data)

# Parquet ํŒŒ์ผ๋กœ ์ €์žฅ
df.to_parquet('data.parquet', engine='pyarrow', compression='snappy')
 
 

3.3. ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

# Parquet ํŒŒ์ผ ์ฝ๊ธฐ
df = pd.read_parquet('data.parquet', engine='pyarrow')

print(df)

#       name  age     city
# 0    Alice   25    Seoul
# 1      Bob   30    Busan
# 2  Charlie   35  Incheon
 

4. Parquet์ด ์œ ์šฉํ•œ ๊ฒฝ์šฐ


  • ๋น…๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ: Spark, Dask ๊ฐ™์€ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•จ
  • ํด๋ผ์šฐ๋“œ ์ €์žฅ: Amazon S3, Google Cloud Storage ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€์—์„œ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉ ๊ฐ€๋Šฅํ•จ
  • ๋จธ์‹ ๋Ÿฌ๋‹ ๋ฐ์ดํ„ฐ์…‹: ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์†๋„์™€ ์ €์žฅ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Œ

5. ๊ฒฐ๋ก 


Parquet ํŒŒ์ผ์€ ์ปฌ๋Ÿผ ๊ธฐ๋ฐ˜ ์ €์žฅ ๋ฐฉ์‹, ๋›ฐ์–ด๋‚œ ์••์ถ• ์„ฑ๋Šฅ, ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์†๋„ ๋•๋ถ„์— ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ๋จธ์‹ ๋Ÿฌ๋‹ ํ”„๋กœ์ ํŠธ์—์„œ ๋งค์šฐ ์œ ์šฉํ•จ. CSV๋ณด๋‹ค ๋” ํšจ์œจ์ ์ด๋ฉฐ, ํŠนํžˆ ๋น…๋ฐ์ดํ„ฐ ํ™˜๊ฒฝ์—์„œ ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•จ.

CSV๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค๋ฉด Parquet์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์†๋„์™€ ์ €์žฅ ๊ณต๊ฐ„์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Œ

๋ฐ˜์‘ํ˜•