주요 컨텐츠로 이동

Unity Catalog의 Python 사용자 정의 테이블 함수(UDTF) 소개

introducing uc python user defined table functions og

Summary

  • Unity Catalog의 Python UDTF는 Python UDTF를 한 번 생성하고 lakehouse의 모든 위치(예: SQL Warehouse, 표준 및 전용 클러스터, Serverless compute 등)에서 호출할 수 있는 간단하면서도 강력한 방법을 제공합니다.
  • Unity Catalog의 다른 데이터 자산과 마찬가지로 검색하고 관리할 수 있습니다.

Python UDF를 사용하면 사용자 지정 로직의 추상화 계층을 구축하여 query 구성을 단순화할 수 있습니다. 하지만 대규모 모델을 실행하거나 테이블의 행 전체에서 효율적으로 패턴을 감지하는 등 복잡한 로직을 적용하고 싶다면 어떻게 해야 할까요?

더 강력한 맞춤형 query 로직을 지원하기 위해 세션 범위 Python UDTF(사용자 정의 테이블 함수) 를 소개해 드렸습니다. UDTF를 사용하면 전체 테이블에 대해 강력하고 상태 저장(stateful) Python 로직을 실행할 수 있어, 순수 SQL만으로는 해결하기 어려운 문제를 쉽게 해결할 수 있습니다.

사용자 정의 테이블 함수를 사용하는 이유:

  • 모든 데이터 세트를 유연하게 처리

    선언적 TABLE() 키워드를 사용하면 모든 테이블, 뷰 또는 동적 하위 쿼리를 UDTF에 직접 파이프할 수 있습니다. 이를 통해 함수는 데이터의 모든 슬라이스에 대해 강력하고 재사용 가능한 빌딩 블록이 됩니다. Python 함수 내에서 직접 독립적인 함수 호출로 처리할 행의 하위 집합으로 입력 테이블을 분할하기 위해 PARTITION BY, ORDER BY, WITH SINGLE PARTITION 을 사용할 수도 있습니다.

  • 파티션당 한 번만 과중한 초기화 실행

    UDTF를 사용하면 대규모 ML 모델을 로드하거나 큰 참조 파일을 로드하는 등 비용이 많이 드는 설정 코드를 모든 단일 행이 아닌 각 데이터 파티션에 대해 한 번만 실행할 수 있습니다.

  • 행 전반에 걸쳐 컨텍스트 유지

    UDTF는 파티션 내에서 한 행에서 다음 행으로 상태를 유지할 수 있습니다. 이 고유한 기능을 통해 시계열 패턴 감지 및 복잡한 실행 계산과 같은 고급 분석이 가능합니다.

더 좋은 점은 UDTF가 Unity Catalog(UC)에 정의되면 적절한 액세스 권한을 가진 모든 사람이 이러한 함수에 액세스하고 검색하고 실행할 수 있다는 것입니다. 요컨대, 한 번만 작성하면 어디서든 실행할 수 있습니다.

Databricks Runtime 17.3 LTS, Databricks SQL 및 Serverless Notebooks and Jobs와 함께 공개 미리 보기로 제공되는 UC Python UDTF를 발표하게 되어 기쁩니다.

이 블로그에서는 UC Python UDTF의 몇 가지 일반적인 사용 사례를 예시와 함께 살펴보고, 데이터 파이프라인에서 이를 활용하는 방법을 설명합니다.

하지만 먼저, 왜 UC와 함께 UDTF를 사용해야 할까요?

Unity Catalog Python UDTF의 장점

  • 순수 Python으로 한 번 구현하면 세션과 Workspace 어디에서든 호출할 수 있습니다.

    표준 Python 클래스에 로직을 작성하고 SQL Warehouse(Databricks SQL Pro 및 서버리스 사용), 표준 및 전용 UC 클러스터링, Lakeflow 선언적 파이프라인에서 Python UDTF를 호출하세요.

  • 시스템 테이블 또는 Catalog Explorer를 사용하여 탐색

  • 완전한 Unity Catalog 거버넌스를 통해 사용자 간에 공유하세요.
  • Python UDTF에 대한 권한 부여 및 취소

  • LakeGuard 격리를 통한 보안 실행: Python UDTF는 임시 디스크 및 네트워크 액세스가 있는 샌드박스에서 실행되므로 다른 워크로드의 간섭 가능성을 방지합니다.

빠른 Start: 간소화된 IP 주소 매칭

일반적인 데이터 엔지니어링 문제로 시작해 보겠습니다. 바로 IP 주소를 네트워크 CIDR 블록 목록과 일치시키는 것입니다(예: 내부 네트워크의 트래픽 식별). 이 작업은 표준 SQL에서는 까다롭습니다. CIDR 로직과 패키지를 위한 기본 내장 함수가 없기 때문입니다.

UC Python UDTF는 이러한 마찰을 제거합니다. Python의 풍부한 라이브러리와 알고리즘을 SQL로 직접 가져올 수 있습니다. 다음을 수행하는 함수를 빌드합니다.

  1. IP logs 테이블을 입력으로 받습니다.
  2. 데이터 파티션당 한 번만 알려진 네트워크 CIDR 목록을 효율적으로 로드합니다.
  3. 각 IP 주소에 대해 Python의 강력한 ipaddress 라이브러리를 사용하여 알려진 네트워크 중 하나에 속하는지 확인합니다.
  4. 매칭된 네트워크 정보가 추가된 원본 Logs 데이터를 반환합니다.

IPv4 및 IPv6 주소를 모두 포함하는 몇 가지 샘플 데이터로 시작합니다.

다음으로 UDTF를 정의하고 등록합니다. Python 클래스 구조를 확인하세요.

  • t TABLE parameter는 모든 스키마의 입력 테이블을 허용하며, UDTF는 제공된 모든 열을 처리하도록 자동으로 조정됩니다. 이러한 유연성은 함수 시그니처를 수정할 필요 없이 여러 테이블에서 동일한 함수를 사용할 수 있음을 의미하지만, 행의 스키마를 신중하게 확인해야 합니다.
  • __init__ 메서드는 대규모 네트워크 목록을 로드하는 것과 같이 부하가 큰 일회성 설정에 적합합니다. 이 작업은 입력 테이블의 파티션당 한 번씩 수행됩니다.
  • eval 메서드는 핵심 일치 논리를 포함하여 각 행을 처리합니다. 이 메서드는 해당 파티션에 대한 IpMatcher UDTF 클래스의 해당 인스턴스에서 사용되는 입력 파티션의 각 행에 대해 정확히 한 번 실행됩니다.
  • HANDLER 절은 UDTF 로직을 구현하는 Python 클래스의 이름을 지정합니다.

이제 ip_cidr_matcher 가 Unity Catalog에 등록되었으므로 TABLE() 구문을 사용하여 SQL에서 직접 호출할 수 있습니다. 일반 테이블을 쿼리하는 것만큼 간단합니다.

출력은 다음과 같습니다.

log_idip_address네트워크ip_version
log1192.168.1.100192.168.0.0/164
log210.0.0.510.0.0.0/84
log3172.16.0.10172.16.0.0/124
log48.8.8.8null4
log52001:db8::12001:db8::/326
log62001:db8:85a3::8a2e:370:73342001:db8::/326
log7fe80::1fe80::/106
log8::1::1/1286
log92001:db8:1234:5678::12001:db8::/326

배치 추론으로 이미지 캡션 생성

이 예제에서는 Databricks 비전 모델 서빙 Endpoint를 사용하여 배치 이미지 캡셔닝을 위한 UC Python UDTF의 설정 및 사용법을 단계별로 살펴봅니다. 먼저 Wikimedia Commons의 공개 이미지 URL이 포함된 테이블을 만듭니다.

이 테이블에는 자연 산책로, 개미 매크로 사진, 고양이, 은하계의 4가지 샘플 이미지가 포함되어 있습니다.

그런 다음 이미지 캡션을 생성하기 위해 UC Python UDTF를 만듭니다.

  1. 먼저 배치 크기, Databricks API 토큰, 비전 모델 endpoint, workspace URL을 포함한 구성으로 UDTF를 초기화합니다.
  2. eval 메서드에서 이미지 URL을 버퍼에 수집합니다. 버퍼가 배치 크기에 도달하면 배치 처리를 시작합니다. 이렇게 하면 이미지당 개별 호출이 아니라 단일 API 호출로 여러 이미지를 함께 처리할 수 있습니다.
  3. 배치 처리 방식에서는 버퍼링된 모든 이미지를 download하고 base64로 인코딩한 다음 Databricks VisionModel에 대한 단일 API 요청으로 전송합니다. 모델은 모든 이미지를 동시에 처리하고 전체 배치에 대한 캡션을 반환합니다.
  4. terminate 메서드는 각 파티션의 끝에서 정확히 한 번 실행됩니다. terminate 메서드에서는 버퍼에 남아 있는 모든 이미지를 처리하고 수집된 모든 캡션을 결과로 생성합니다.

<workspace-url> 을 실제 Databricks workspace URL(예: https://your-workspace.cloud.databricks.com)로 바꾸세요.

배치 이미지 캡션 UDTF를 사용하려면 샘플 이미지 테이블로 호출하기만 하면 됩니다. your_secret_scopeapi_token 을 Databricks API 토큰의 실제 secret scope 및 키 이름으로 바꾸세요.

출력은 다음과 같습니다.

캡션
푸른 하늘 아래 생생한 습지 풀 사이를 가로지르는 나무 판자 산책로
질감이 있는 표면에 서 있는 검은 개미의 상세한 매크로 사진
흰 벽을 배경으로 흰 선반 위에 편안하게 누워 있는 태비 고양이
우주의 검은 공허를 배경으로 밝은 중심 핵과 길게 뻗은 청백색 나선팔을 가진 멋진 나선 은하.

카테고리별로 이미지 캡션을 생성할 수도 있습니다.

출력은 다음과 같습니다.

캡션
질감이 있는 표면에 서 있는 검은 개미의 상세한 매크로 사진
검은 우주를 배경으로 밝은 중심부와 푸른빛을 띤 채 넓게 뻗은 나선팔을 가진 멋진 나선 은하.
흰색 벽을 배경으로 흰색 선반 위에 편안하게 누워 있는 태비 고양이
푸른 하늘 아래 무성한 습지 풀을 가로지르는 나무 보드워크

향후 작업

저희는 다음과 같이 더욱 강력하고 성능이 뛰어난 기능으로 Python UDTF를 확장하기 위해 적극적으로 노력하고 있습니다.

  • Unity Catalog의 다형성 UDTF 는 출력 스키마가 입력 인수에 따라 동적으로 분석되고 확인되는 함수입니다. 세션 범위 Python UDTF에서는 이미 지원되며 Unity Catalog의 Python UDTF에 대해서는 현재 진행 중입니다.
  • Python Arrow UDTF: 네이티브 Apache Arrow 레코드 배치(iterator[Arrow.record_batch])로 데이터 처리를 지원하는 새로운 Python UDTF API 대규모 데이터 세트에서 상당한 성능 향상을 제공합니다.

 

(이 글은 AI의 도움을 받아 번역되었습니다. 원문이 궁금하시다면 여기를 클릭해 주세요)

게시물을 놓치지 마세요

관심 있는 카테고리를 구독하고 최신 게시물을 받은편지함으로 받아보세요