Lookup UDF 조인

Lookup UDF 조인 (Lookup UDF Join)

차원 테이블에서 기본 키를 통해 차원 데이터를 가져와 결과를 장식하는 Lookup UDF에 대해 배우는 페이지예요.

출처: Lookup UDF Join

본문

멀티 스테이지 쿼리 엔진과 함께 JOIN을 사용하는 방법에 대한 자세한 내용은 JOINs를 참고하세요.

{% hint style="info" %} Lookup UDF Join은 단일 스테이지 쿼리 엔진(v1)에서만 지원됩니다. 멀티 스테이지 쿼리 엔진에서는 query hints로 lookup join을 실행할 수 있습니다. 자세한 내용은 JOINs를 참고하세요. {% endhint %}

Lookup UDF는 차원 테이블에서 기본 키를 통해 차원 데이터를 가져와 decoration join 기능을 가능하게 하는 데 사용됩니다. Lookup UDF는 Pinot의 차원 테이블에서만 사용할 수 있습니다.

접근 제어

LOOKUP()를 사용하는 쿼리는 FROM 절의 테이블과 함수가 명명한 모든 차원 테이블 모두에 대해 인가되어야 합니다. 요청자가 참조한 차원 테이블에 대한 테이블 접근 권한이 없으면 Pinot는 HTTP 403을 반환합니다.

LOOKUP()는 기본 키로 행을 직접 해석하므로 차원 테이블에 행 수준 보안(RLS) 필터를 적용할 수 없습니다. pinot.broker.enable.row.column.level.auth로 브로커 행·열 수준 인가가 활성화되어 있고, 요청자가 차원 테이블에 대해 RLS 필터를 구성했다면 Pinot는 lookup 쿼리를 거부합니다. 차원 테이블에 행 수준 필터링이 필요하면 일반 멀티 스테이지 lookup join을 사용하세요.

커스텀 브로커 접근 제어 구현은 단일 쿼리가 fact 테이블과 하나 이상의 lookup 차원 테이블을 참조할 수 있으므로 authorize(RequesterIdentity, Set<String>)를 통해 테이블 집합에 대한 테이블 인가를 구현해야 합니다.

문법

UDF 함수 문법은 다음과 같습니다:

lookupUDFSpec:
    LOOKUP
    '('
    '''dimTable'''
    '''dimColToLookup'''
    [ '''dimJoinKey''', factJoinKey ]*
    ')'
  • dimTable 조회를 수행할 dim 테이블의 이름.
  • dimColToLookUp 결과를 장식하기 위해 가져올 dim 테이블의 컬럼 이름.
  • dimJoinKey 조회를 수행할 컬럼 이름, 즉 dim 테이블의 조인 컬럼 이름.
  • factJoinKey 조회를 수행할 상대 컬럼 이름, 예를 들어 fact 테이블의 조인 컬럼 이름.

주의할 점:

  1. dim 테이블 관련 표현식은 모두 리터럴 문자열로 표현됩니다. 이는 LOOKUP UDF 문법의 제약입니다: 쿼리 메인 테이블(factTable)에 존재하지 않는 컬럼 식별자는 표현할 수 없습니다.
  2. [ '''dimJoinKey''', factJoinKey ]*의 문법 정의는 dim 파티션 컬럼이 여러 개면 조인 키 쌍도 여러 개 표현되어야 함을 나타냅니다.

예제

여기 몇 가지 예제가 있습니다.

단일 파티션 키 컬럼 예제

테이블 baseballStats:

Column Type
playerID STRING
yearID INT
teamID STRING
league STRING
playerName STRING
playerStint INT
numberOfGames INT
numberOfGamesAsBatter INT
AtBatting INT
runs INT

그리고 dim 테이블 dimBaseballTeams:

Column Type
teamID STRING
teamName STRING
teamAddress STRING

몇 가지 수용 가능한 쿼리:

Dim-Fact LOOKUP 예제

SELECT
  playerName,
  teamID,
  LOOKUP('dimBaseballTeams', 'teamName', 'teamID', teamID) AS teamName,
  LOOKUP('dimBaseballTeams', 'teamAddress', 'teamID', teamID) AS teamAddress
FROM baseballStats
playerName teamID teamName teamAddress
David Allan BOS Boston Red Caps/Beaneaters (from 1876–1900) or Boston Red Sox (since 1953) 4 Jersey Street, Boston, MA
David Allan CHA null null
David Allan SEA Seattle Mariners (since 1977) or Seattle Pilots (1969) 1250 First Avenue South, Seattle, WA
David Allan SEA Seattle Mariners (since 1977) or Seattle Pilots (1969) 1250 First Avenue South, Seattle, WA

Self LOOKUP 예제

SELECT 
  teamID, 
  teamName AS nameFromLocal,
  LOOKUP('dimBaseballTeams', 'teamName', 'teamID', teamID) AS nameFromLookup
FROM dimBaseballTeams
teamID nameFromLocal nameFromLookup
ANA Anaheim Angels Anaheim Angels
ARI Arizona Diamondbacks Arizona Diamondbacks
ATL Atlanta Braves Atlanta Braves
BAL Baltimore Orioles (original- 1901–1902 current- since 1954) Baltimore Orioles (original- 1901–1902 current- since 1954)

복합 파티션 키 컬럼 예제

다음 스키마를 가진 단일 차원 테이블을 생각해 보세요:

BILLING SCHEMA

Column Type
customerId INT
creditHistory STRING
firstName STRING
lastName STRING
isCarOwner BOOLEAN
city STRING
maritalStatus STRING
buildingType STRING
missedPayment STRING
billingMonth STRING

Self LOOKUP 예제

select 
  customerId,
  missedPayment, 
  LOOKUP('billing', 'city', 'customerId', customerId, 'creditHistory', creditHistory) AS lookedupCity 
from billing
customerId missedPayment lookedupCity
341 Paid Palo Alto
374 Paid Mountain View
398 Paid Palo Alto
427 Paid Cupertino
435 Paid Cupertino

사용 FAQ

  • UDF의 데이터 반환 타입은 dimColToLookUp 컬럼 타입과 같습니다.
  • 차원 테이블에 여러 기본 키 컬럼(예: 복합 기본 키)이 사용되면, lookup() UDF에 나타나는 키 순서가 차원 테이블 스키마의 primaryKeyColumns에 정의된 순서와 같도록 보장하세요.

더 알아보기 (Learn more)