티스토리 뷰
반응형
ipython 의 매직명령어 표현이 아닌 python 코드로 사용하는 방법이 필요한 경우를 알려주고자 한다.
참고로 %sql 표현으로 사용가능한 방법은 아래 링크에 정리해 두었다.
python 코드로 duckdb 에서 읽기
minio 기반의 s3 환경에 접근할때는 아래와 같이 ENTRYPOINT 변경이 필요하다.
그 이외에는 특별히 다를게 없다, 아래와 같이 정보를 set 명령을 통해 선언하는게 가능하다.
# duckdb 와 연계하여 실행
import duckdb
# duckdb connection
conn = duckdb.connect()
# Set the necessary S3 configurations
conn.execute("SET s3_region = 'us-east-1';")
conn.execute("SET s3_url_style = 'path';")
conn.execute("SET s3_endpoint = '10.10.10.1:9000';")
conn.execute("SET s3_access_key_id = 'AKIAIOSFODNN7EXAMPLE';")
conn.execute("SET s3_secret_access_key = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY';")
conn.execute("SET s3_use_ssl = false;")
# Load the HTTPFS extension
conn.execute("INSTALL 'httpfs';")
conn.execute("LOAD 'httpfs';")
# https://duckdb.org/docs/data/csv/overview.html
conn.execute("""
CREATE TABLE t_sample AS
SELECT *
FROM read_csv(
's3://버킷명/파일명',
delim = ',',
header = true
);
""")
# 쿼리 실행
query = """
SELECT
*
FROM
t_sample
WHERE
CAST(clk_cnt AS BIGINT) > 0
AND CAST(imp_cnt AS BIGINT) > 0
ORDER BY sales_amt desc
limit 10
"""
cursor = conn.execute(query)
result = cursor.fetchdf()
# 출력
display(result)
conn.close()
다양한 리턴타입을 지원하는 duckdb
샘플코드에서는 DataFrame 객체로 리턴하게 사용했는데, 사실 더 다양한 형태의 데이터 리턴을 지원한다.
fetchdf() 가 아닌 fetchnumpy() 도 지원하고, python 의 리스트 타입형태로 리턴하는 fetchall() 메소드도 존재한다.
그래서 필요한 데이터 타입으로 리턴받아 재가공하는것도 꽤 편하다.
https://duckdb.org/docs/api/python/conversion.html
덤으로 duckdb 에서는 parquet 은 지원하는데 orc 포맷이 지원되지 않고, hdfs 도 기본지원안되는데 python 에서 pyarrow 와 연계하면 이런 문제도 쉽게 해결가능하다. 이 내용도 나중에 다루도록 하겠다.
반응형
댓글