Contour의 비결정적 계산
같은 입력과 분석 로직을 사용해도 결과가 달라질 수 있는 계산을 비결정적 계산이라고 합니다. 정렬 동률, 현재 시각 함수와 분산 부동소수점 집계가 대표적인 원인입니다.
윈도 정렬의 동률
ROW_NUMBER, FIRST, LAST, LEAD, LAG, NTILE, ARRAY_AGG와 ARRAY_AGG_DISTINCT를 사용할 때는 파티션 안의 ORDER BY 값이 행을 구분하는지 확인합니다. 같은 파티션에서 정렬값이 같은 행이 여러 개면 순서에 영향을 받는 결과가 바뀔 수 있습니다. Expression 보드는 결정적인 정렬인지 확인하도록 경고합니다.
다음은 가상 성적 데이터입니다.
| name | class | grade |
|---|---|---|
| Aaron | Math | 95 |
| Burt | Math | 95 |
| Chrissy | Math | 80 |
| Angelica | Science | 77 |
| Burt | Science | 81 |
| Charlie | Science | 66 |
다음 식으로 rank 열을 만들면 Math의 Aaron과 Burt는 동률입니다.
ROW_NUMBER() OVER (PARTITION BY "class" ORDER BY "grade" DESC)
| name | class | grade | 가능한 rank | 다른 실행의 가능한 rank |
|---|---|---|---|---|
| Aaron | Math | 95 | 1 | 2 |
| Burt | Math | 95 | 2 | 1 |
| Chrissy | Math | 80 | 3 | 3 |
| Angelica | Science | 77 | 2 | 2 |
| Burt | Science | 81 | 1 | 1 |
| Charlie | Science | 66 | 3 | 3 |
이 가상 표에서는 name이 동률 행을 구분하므로 다음 보조 정렬로 Aaron을 1, Burt를 2로 고정할 수 있습니다.
ROW_NUMBER() OVER (
PARTITION BY "class"
ORDER BY "grade" DESC, "name" ASC
)
실제 데이터에서 이름도 중복된다면 행을 구분하는 고유한 키를 사용합니다. ROW_NUMBER는 동률에 같은 순위를 주는 함수가 아니라 각 행에 별도 번호를 부여합니다.
현재 시각과 생성 ID
CURRENT_DATE, CURRENT_TIMESTAMP, CURRENT_UNIX_TIMESTAMP와 MONOTONICALLY_INCREASING_ID도 값이 실행에 의존합니다.
현재 시각 함수는 경로를 갱신할 때 계산합니다. 첫날 CURRENT_DATE 열을 만든 뒤 다음 날 분석을 다시 열어도 경로를 갱신하지 않으면 전날 값을 볼 수 있습니다. MONOTONICALLY_INCREASING_ID는 경로를 계산할 때마다 값이 달라질 수 있습니다.
double 집계
분산 집계에서는 부분 결과를 결합하는 순서가 달라질 수 있습니다. 부동소수점 반올림이 누적되는 방식에 따라 같은 입력의 집계값에도 0.000001 수준의 작은 차이가 생길 수 있습니다.
double 열의 mean, sum, stddev, variance, corr와 sum_distinct 결과가 해당됩니다. 이 결과를 다시 필터링하거나 조인에 사용하면 후속 결과에도 차이가 전파될 수 있습니다.
다음 예시는 Pivot Table에서 pickup_latitude의 평균을 구한 뒤 집계 데이터로 전환한 경우입니다.
Staten Island의 평균을 40.5830495로 표시했을 때 그 값과 정확히 같은 행만 필터링하면 행 하나가 남을 수 있습니다. 재계산 후 평균이 조금 달라지면 그 행이 조건에서 빠질 수 있습니다. 이런 열에는 정확한 값 일치 필터를 피하고 조인 키로도 사용하지 않는 것이 권장됩니다.
Contour는 해당 열에 작업을 적용하는 보드에서 경고하고 비결정성의 원인이 된 집계를 표시합니다.
행 수가 예상과 다를 때
입력이 같은 상태에서 두 Summary 보드 사이에 행 수를 바꾸지 않는 변환만 있는데 행 수가 서로 다르면, 경로 위쪽의 비결정적 계산을 살펴봅니다. 윈도 정렬과 double 집계를 사용하는 보드의 경고가 조사할 단서입니다.