brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Jun 15. 2024

Python: DuckDB(2)

#Basic #NYCDB

간단하게 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 에 넣는 그런...

일은 하지 않아도 된다.


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 은 이전에도 포스팅에 언급했는데 쓰면 빠르다...

1.29초 정도...


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

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari