티스토리 뷰

반응형

우선 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 를 경유해서 쿼리로 돌릴수 있으니 다양한 포맷을 다루려면 사실상 필수인것 같다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함