Spark SQL 해시, 극값과 조건식
행별 극값과 해시는 그룹 집계 함수와 구분합니다. 아래 함수들은 입력 SQL 표현식으로부터 새 열 값을 만듭니다.
해시와 바이너리 표현
| 함수와 인자 | 반환과 의미 |
|---|---|
CRC32(expr) | 바이너리의 CRC32 checksum, bigint |
HASH(expr1, expr2, ...) | 열들의 해시 코드, int |
HEX(expr) | 정수/바이너리 또는 문자열의 16진 표현 문자열 |
MD5(expr) | 바이너리의 MD5 digest, 32문자 hex 문자열 |
SHA1(expr) | 바이너리의 SHA-1 digest, 40문자 hex 문자열 |
SHA2(expr, numBits) | SHA-2 계열 digest의 hex 문자열 |
HEX는 정수의 숫자 표현과 문자열 바이트의 표현을 구분합니다. SHA2의 numBits는 224, 256, 384, 512 또는 0이며 0은 256과 같습니다.
SELECT
CRC32(ENCODE('Spark', 'UTF-8')) AS crc_value,
HASH('Spark', 1) AS row_hash,
HEX('Spark') AS hex_text,
MD5(ENCODE('Spark', 'UTF-8')) AS md5_text,
SHA1(ENCODE('Spark', 'UTF-8')) AS sha1_text,
SHA2(ENCODE('Spark', 'UTF-8'), 256) AS sha256_text
해시나 hex는 암호화가 아니며, 작은 값 공간의 개인정보에 해시를 적용했다고 익명성이 보장되지는 않습니다.
여러 값의 최댓값과 최솟값
GREATEST(expr1, expr2, ...)와 LEAST(expr1, expr2, ...)는 적어도 두 인자를 받습니다. NULL을 건너뛰며 모든 값이 NULL일 때만 NULL입니다. 같은 행의 여러 값 중 극값을 구하는 연산으로 그룹 전체의 MAX/MIN과 다릅니다.
SELECT
GREATEST(1, 3, NULL) AS largest_value,
LEAST(1, 3, NULL) AS smallest_value
NaN과 불리언
| 표현식 | 의미 |
|---|---|
ISNAN(expr) | 값이 NaN인지 검사 |
NANVL(first, second) | first가 NaN이면 second, 아니면 first |
NOT predicate | 불리언 조건 반전 |
NANVL은 NaN을 위한 선택이며 NULL을 대체하는 COALESCE와 다릅니다.
SELECT
ISNAN(CAST('NaN' AS DOUBLE)) AS has_nan,
NANVL(CAST('NaN' AS DOUBLE), 0.0) AS replacement,
NOT (3 > 1) AS inverted_condition
WHEN 조건식
SQL에서는 CASE WHEN으로 조건에 따른 값을 선택합니다. 앞에서부터 True인 분기의 결과를 사용하고, 일치한 분기가 없으면 ELSE 값을 사용합니다. ELSE가 없으면 NULL입니다.
SELECT
value,
CASE
WHEN value > 0 THEN 'positive'
WHEN value = 0 THEN 'zero'
WHEN value < 0 THEN 'negative'
END AS sign_category
FROM VALUES (-1), (0), (2), (NULL) AS samples(value)
DataFrame API의 when(condition, value)와 SQL의 CASE 구문은 같은 조건 선택 개념을 다른 문법으로 표현합니다. 반환 분기들의 자료형은 호환되어야 합니다.