티스토리 뷰
반응형
우선 duckdb 에서 s3 는 기본지원이 되는데, hdfs 는 기본지원이 안된다.
jupyter 에서 duckdb 를 이용해서 간단한 필터링과 정렬을 sql 기반으로 다룰수 있어서 유용한데 hdfs 의 파일을 분석할때 고민이 되는데, 이때는 pyarrow 를 이용하여 연동하면 대부분 해결된다. (orc 포맷도 pyarrow 로 해결가능함)
해결방법
당연하지만 pyarrow 와 duckdb 라이브러리는 깔려있어야한다.
그리고 여기서는 kerberos 인증을 keytab파일을 통해 hadoop 연결을 한다고 가정하겠다.
우선 다음과 같이 keytab 인증을 한다고 가정한다. 주피터에서는 이런 명령을 실행할때 맨앞에 ! 를 넣고 라인에서 실행하는것도 가능하다.
kinit -kt /home1/user/myuser.keytab -c /tmp/cc_my_hadoop myuser@KB.HOHO.COM
그 이후 python 코드로 pyarrow.fs 로 하둡 파일시스템을 선언하고, 파일을 읽어서 duckdb 에 등록하여 쿼리로 돌려서 결과 확인하는게 가능해진다. 참고로 아래 예제는 \t 을 구분자로 저장한 텍스트파일을 duckdb 로 조회하는 예제이다.
import pyarrow.fs as fs
import pyarrow.csv as csv
import duckdb
hdfs = fs.HadoopFileSystem(host='hdfs://myspace', user='myuser', kerb_ticket='/tmp/cc_my_hadoop')
file_path = "/user/myuser/export/sample.tsv"
table = None
with hdfs.open_input_file(file_path) as file:
table = csv.read_csv(
file,
parse_options=csv.ParseOptions(delimiter="\t") # 구분자 설정
)
conn = duckdb.connect()
conn.register("v_table", table)
# 클릭수가 높은것 100개
query = """
SELECT
*
FROM
v_table
LIMIT 10
"""
result = conn.execute(query).df()
# Jupyter에서 결과 테이블 출력
display(result)
DataFrame 객체로 리턴받기위해서 df() 를 호출했는데 fetchall() 을 쓰면 python 객체 형태로 리턴받아 사용하는것도 가능합니다.
여기서 핵심은 pyarrow 를 써서 분석이 가능하다는점이다.
orc 포맷도 pyarrow.orc 를 이용하면 duckdb 를 경유해서 쿼리로 돌릴수 있으니 다양한 포맷을 다루려면 사실상 필수인것 같다.
반응형
'데이터처리 > Duckdb' 카테고리의 다른 글
[DuckDB] csv 파일을 읽을때 헤더 있을때와 없을때 사용법 정리 (0) | 2024.12.26 |
---|---|
[DuckDB] minio 기반의 s3 에 업로드된 엑셀파일 연동방법 : %sql 표현 (1) | 2024.12.20 |
댓글