본문 바로가기
C.W.K.
Stream
Lesson 04 of 06 · published

Apache Arrow — 본드 포맷

~10 min · arrow, format, interop

Level 0구경꾼
0 XP0/47 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

파일 포맷이 아니라 in-memory 표준

Apache Arrow 는 Pandas (3.0+), Polars, DuckDB, PyArrow, 그리고 수많은 DB 클라이언트 라이브러리가 속으로 함께 쓰는, 언어에 묶이지 않는 columnar 메모리 포맷이야. Disk 에 오래 보관하는 파일 포맷은 아니야. Arrow IPC 파일이 있긴 하지만, 본질은 도구 사이의 데이터 이동을 공짜에 가깝게 만드는 in-memory 표현이야.

실전에서 왜 중요해?

옛 세상은 이랬어: 메모리 속 Pandas DataFrame 은 byte 를 이렇게 눕히고, Spark DataFrame 은 저렇게 눕히고, PostgreSQL row 는 또 다르게. 건널 때마다 serialize-deserialize. Arrow 가 그 벽을 없애 — 양쪽 다 Arrow 를 쓰면 같은 메모리 buffer 를 그대로 공유해. Copy 없음, serialization 없음, 포맷 변환 없음. pl.from_pandas(df), duckdb.sql(...).arrow(), arrow_table.to_pandas(zero_copy_only=True) 가 ms 짜리가 아니라 µs 짜리 연산이 돼.

Arrow 를 직접 만질 때

  • Parquet 보다 빨리 로드되는 도구 중립 disk 포맷이 필요할 때 (단기 scratch 용 Arrow IPC).
  • REST/JSON 대신 Arrow Flight 로 tabular 데이터를 네트워크로 나를 때.
  • pd.read_parquet 가 안 열어 주는 기능이 필요해서 pyarrow.parquet 을 직접 부를 때.

대부분은 Arrow 를 직접 import 할 일이 없어. Arrow-aware 라이브러리를 골라 쓰다 보면 stack 의 나머지가 어쩐지 빨라졌다는 것만 알아채게 돼.

Code

Pandas ↔ Arrow ↔ Polars copy 없이 round-trip·python
import pandas as pd
import pyarrow as pa
import polars as pl

pdf = pd.DataFrame({'order_id': ['A1', 'A2'], 'amount': [100.0, 250.0]})

# Pandas → Arrow (Arrow-backed dtype 이미 있으면 zero-copy)
tbl = pa.Table.from_pandas(pdf)

# Arrow → Polars (zero-copy)
pl_df = pl.from_arrow(tbl)

# Polars → Arrow → Pandas
back_to_pandas = pl_df.to_arrow().to_pandas(types_mapper=pd.ArrowDtype)
print(back_to_pandas.dtypes)        # Arrow-backed dtype 보존됨

External links

Exercise

1M row Pandas DataFrame 을 만들어. pa.Table.from_pandas 로 Arrow 로 바꾸고, tbl.nbytes (Arrow 가 보는 테이블 크기) 를 출력해서 pdf.memory_usage(deep=True).sum() (Pandas 가 보는 크기) 와 비교해 봐. 둘이 가까울수록 그 DataFrame 이 Arrow 에 깔끔하게 얹힌다는 뜻이야 — "이 DataFrame, PyArrow-backed dtype 을 벌써 쓰고 있나?" 를 가늠하는 쓸 만한 잣대야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.