Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Code Workspaces의 SQL 읽기

Python의 SQL executor로 표 형식 데이터셋과 SQL을 지원하는 데이터셋 뷰, 객체 구체화, Iceberg 테이블 및 가상 테이블을 조회할 수 있습니다. 일반 Dataset import에서 데이터셋 뷰를 원본 데이터셋처럼 읽는 경로와는 다릅니다.

먼저 읽을 자원을 작업공간에 사용할 수 있도록 구성하고 별칭을 정합니다. 아래 ducklings는 가상 Ducks 데이터셋의 등록 별칭입니다. 코드에는 표시 이름 Ducks 대신 별칭을 사용합니다.

질의 범위와 결과

각 SELECT 문에서는 데이터셋 하나만 조회할 수 있습니다. SQL 결과는 PyArrow Table로 반환하며 필요하면 pandas 등의 형식으로 바꿉니다.

SQL 쿼리의 기본 한도는 1,000,000행입니다. 더 많은 행을 처리하려면 서로 나눈 쿼리를 병렬로 실행하고 결과를 합칠 수 있지만 최종 결과와 중간 객체가 작업공간 메모리에 들어와야 합니다. 쿼리를 여러 개로 나누는 것 자체가 작업공간의 메모리 한도를 늘리지는 않습니다.

Python executor

작업공간의 Python 환경에 containers-sql과 foundry-platform-sdk를 설치합니다. FoundrySdkSqlExecutor로 Spark SQL 문을 실행하고 결과를 가져옵니다.

from containers_sql import FoundrySdkSqlExecutor

sql = FoundrySdkSqlExecutor()
query = sql.execute("SELECT * FROM `ducklings`")
arrow_table = query.fetch_results(timeout_in_seconds=60)
pandas_df = arrow_table.to_pandas()

fetch_results의 timeout_in_seconds는 결과를 기다릴 시간입니다. 입력 데이터를 줄일 수 있다면 필요한 열과 조건을 SQL에 넣어 결과 크기를 줄입니다.

Jupyter SQL magic

다음은 일반 Python 스크립트가 아닌 Jupyter notebook 셀입니다. 먼저 확장을 불러옵니다.

import containers_sql
%reload_ext containers_sql.foundry_sdk.magics

한 줄 SQL에는 %sql을 사용합니다.

ducklings_df = %sql SELECT hatch_date, bill_color FROM `ducklings`
ducklings_pandas_df = ducklings_df.to_pandas()

여러 줄에는 %%sql을 사용하며 -o 뒤에 결과를 받을 Python 변수 이름을 지정합니다.

%%sql -o ducklings_df
SELECT
    hatch_date,
    bill_color
FROM `ducklings`
LIMIT 10;

hatch_date와 bill_color는 이 가상 입력 스키마의 열입니다. 전체 열을 읽으려면 SELECT *를 사용합니다.

RStudio에서 SQL 사용

RStudio에서는 reticulate를 통해 같은 Python executor를 사용합니다. Python 환경에는 containers-sql, foundry-platform-sdk와 pyarrow, R 환경에는 reticulate 및 tibble이 필요합니다.

library(reticulate)

containers_sql <- import("containers_sql", convert = FALSE)
sql <- containers_sql$FoundrySdkSqlExecutor()
query <- sql$execute("SELECT * FROM `ducklings`")
result_table <- query$fetch_results()

r_columns <- py_to_r(result_table$to_pydict())
result_df <- tibble::as_tibble(r_columns)

convert=FALSE로 Python 객체를 유지하고 py_to_r에서 명시적으로 변환합니다. 이 경로는 중간 R 리스트가 생기므로 작은 결과에 적합합니다.

큰 결과에서 중간 리스트 복사를 피하려면 Feather 파일을 거칠 수 있습니다. R의 arrow 패키지도 필요합니다.

library(reticulate)

feather <- import("pyarrow.feather", convert = FALSE)
local_file <- tempfile(fileext = ".arrow")
feather$write_feather(result_table, local_file)
result_df <- tibble::as_tibble(arrow::read_feather(local_file))
unlink(local_file)

이 방식도 Python의 쿼리 결과와 최종 R 객체 및 임시 파일에 필요한 자원은 확보해야 합니다.

제한 뷰

제한 뷰의 SQL 조회는 Jupyter에서만 지원합니다. 첫 가져오기 시 안내된 Python 의존성을 설치하고 별칭을 정한 뒤 Restricted outputs mode를 켜고 작업공간을 재시작해야 합니다.

이후 일반 SQL 입력과 같이 별칭으로 질의합니다. 제한 뷰 정책이 각 사용자가 읽을 행을 결정하므로 같은 작업공간을 열어도 사용자별 결과가 다를 수 있습니다. 이 모드에서는 데이터셋, 모델과 테이블 출력을 게시할 수 없습니다. Dash와 Streamlit 앱은 제한 뷰를 입력으로 게시할 수 있으며 앱을 여는 사용자의 권한에 따라 결과를 표시합니다.

뷰를 로드한 상태에서 접근 권한이 바뀌면 작업공간 접근을 잃고 재시작해야 합니다. 제한 뷰 자체의 SQL 읽기와 제한 뷰 기반 온톨로지 엔터티의 지원 범위는 구분합니다.