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 테이블의 조인 컬럼 이름.
주의할 점:
- dim 테이블 관련 표현식은 모두 리터럴 문자열로 표현됩니다. 이는 LOOKUP UDF 문법의 제약입니다: 쿼리 메인 테이블(
factTable)에 존재하지 않는 컬럼 식별자는 표현할 수 없습니다. [ '''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에 정의된 순서와 같도록 보장하세요.