brunch

Python: DuckDB(2)

#Basic #NYCDB

by 유윤식

간단하게 DUCKDB 에서 paruet 파일 읽어서 SQL 하나 날려본다.


https://duckdb.org/docs/data/parquet/overview

읽는 방법은 여기서 확인하고,



import duckdb


conn = duckdb.connect()


file_path = './nyc_data/*.parquet'


result = con.execute(f"""

SELECT

passenger_count,

total_amount,

RANK() OVER (PARTITION BY passenger_count ORDER BY total_amount DESC) AS rank

FROM read_parquet('{file_path}')

WHERE passenger_count IS NOT NULL

""").fetch_arrow_table()


# polars 로 데이터 확인

print(pl.from_arrow(result))


** 복잡하게 os.walk 로 디렉토리에 있는 parquet 파일만 찾아서 파일 이름을 List 에 넣는 그런...

일은 하지 않아도 된다.


스크린샷 2024-06-15 01.11.05.png

5초 정도...


이걸 똑같이 polars 로 옮겨보면



import polars as pl


# file_path 는 위와 동일하게 사용


df = pl.scan_parquet(file_path)


df = df.with_columns(

pl.col('total_amount').rank("dense").over('passenger_count').alias('rank')

).filter(

pl.col('passenger_count').is_not_null()

).select([

pl.col('passenger_count'), pl.col('total_amount'), pl.col('rank')

]).collect()


print(df)


scan_parquet 은 이전에도 포스팅에 언급했는데 쓰면 빠르다...

스크린샷 2024-06-15 01.14.41.png

1.29초 정도...


SQL 의 장점만 가져가야 하는 걸까?

keyword
작가의 이전글Python: forust 소개