Spark SQL 문자열과 JSON 함수
문자열 값은 작은따옴표로, 열이나 데이터셋 식별자는 해당 SQL의 식별자 문법으로 전달합니다. 아래 서명의 expr/str은 SQL 표현식이며 charset, 정규식과 구분자 자리에 고정 문자열을 지정할 수 있습니다.
| 함수와 인자 | 결과와 조건 |
|---|---|
ASCII(expr) | 첫 문자의 수치 코드, int |
BASE64(expr) | 바이너리를 Base64 문자열로 인코딩 |
CONCAT(expr1, expr2, ...) | 문자열 열을 연결 |
DECODE(value, charset) | 바이너리를 지정 문자 집합의 문자열로 디코딩 |
ENCODE(value, charset) | 문자열을 지정 문자 집합의 바이너리로 인코딩 |
FORMAT_NUMBER(value, digits) | HALF_EVEN으로 지정 소수 자리까지 반올림한 표시 문자열 |
GET_JSON_OBJECT(json, path) | JSON 경로의 값을 문자열로 추출. 입력 JSON이 잘못되면 NULL |
INSTR(str, substring) | 첫 일치 위치. 1부터 세며 없으면 0, 인자 중 NULL이면 NULL |
JSON_TUPLE(json, field1, field2, ...) | 지정 필드의 값을 여러 문자열 열로 추출 |
LENGTH(expr) | 문자열 문자 길이 또는 바이너리 바이트 길이 |
LEVENSHTEIN(left, right) | 두 문자열의 Levenshtein 편집 거리 |
LOWER(expr) | 소문자 변환 |
LPAD(str, length, pad) | 왼쪽을 pad로 채움. 원래 길이가 더 길면 지정 길이로 자름 |
LTRIM(expr) | 왼쪽 공백 제거 |
REGEXP_EXTRACT(expr, pattern, groupIndex) | Java 정규식의 지정 그룹. 매치나 그룹 일치가 없으면 빈 문자열 |
REGEXP_REPLACE(expr, pattern, replacement) | 정규식과 일치하는 모든 부분 치환 |
REPEAT(str, count) | 지정 횟수 반복 |
REVERSE(str) | 순서 반전 |
RPAD(str, length, pad) | 오른쪽을 pad로 채움. 원래 길이가 더 길면 지정 길이로 자름 |
RTRIM(expr) | 오른쪽 공백 제거 |
SOUNDEX(expr) | SoundEx 코드 |
SPLIT(str, pattern) | 정규식 경계를 기준으로 나눈 배열 |
SUBSTRING(str, position, length) | 문자열 부분 또는 바이너리의 바이트 구간 |
SUBSTRING_INDEX(str, delimiter, count) | 지정 번째 구분자를 기준으로 문자열 일부 선택 |
TRANSLATE(str, matching, replacement) | matching의 문자를 대응 위치의 replacement 문자로 치환 |
TRIM(expr) | 양쪽 공백 제거 |
UNBASE64(expr) | Base64 문자열을 바이너리로 복원 |
UNHEX(expr) | 16진 문자열을 바이트 표현으로 변환 |
UPPER(expr) | 대문자 변환 |
인코딩의 입력과 출력
ENCODE/DECODE가 받는 문자 집합에는 US-ASCII, ISO-8859-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16이 있습니다. 둘 중 어느 인자라도 NULL이면 결과도 NULL입니다. Base64나 hex는 문자 표현이며 암호화가 아닙니다.
SELECT
DECODE(ENCODE('Spark', 'UTF-8'), 'UTF-8') AS decoded_text,
BASE64(ENCODE('Spark', 'UTF-8')) AS base64_text,
UNHEX('537061726B') AS restored_bytes
UNBASE64는 Spark 3.3 이후 잘못된 인코딩 입력에서 오류를 발생시킵니다. 손상된 입력을 무조건 NULL로 바꾼다고 가정하지 않습니다.
숫자를 문자열로 표시하기
FORMAT_NUMBER의 digits가 0이면 소수점과 소수 부분이 없는 문자열을 만듭니다. digits가 음수이면 NULL입니다. 이 함수는 계산용 숫자와 구분되는 표시 문자열을 반환합니다.
SELECT
FORMAT_NUMBER(12345.678, 2) AS formatted_amount,
FORMAT_NUMBER(12345.678, 0) AS formatted_integer
부분 문자열의 방향
INSTR와 SUBSTRING의 위치는 1부터 시작합니다. SUBSTRING은 바이너리 입력이면 바이트 위치와 길이를 사용합니다.
SUBSTRING_INDEX는 구분자를 대소문자까지 일치시킵니다. count가 양수이면 왼쪽부터 세어 마지막 구분자의 왼쪽, 음수이면 오른쪽부터 세어 해당 구분자의 오른쪽을 반환합니다.
SELECT
SUBSTRING('abcdef', 2, 3) AS middle_text,
SUBSTRING_INDEX('a.b.c.d', '.', 2) AS first_parts,
SUBSTRING_INDEX('a.b.c.d', '.', -3) AS last_parts
JSON과 정규식
JSON_TUPLE은 여러 필드명을 나열하며 결과 열에도 각각 이름을 지정합니다.
SELECT JSON_TUPLE('{"name":"Sara","age":31}', 'name', 'age') AS (name, age_text)
GET_JSON_OBJECT는 JSON path를 사용하여 추출 결과를 문자열로 반환합니다. JSON 파싱 결과를 숫자나 구조체로 사용하는 것과 구분합니다.
SELECT
GET_JSON_OBJECT('{"person":{"name":"Sara"}}', '$.person.name') AS person_name,
REGEXP_EXTRACT('order-123', '([0-9]+)', 1) AS order_digits,
REGEXP_REPLACE('A-1 B-2', '[0-9]+', 'X') AS masked_digits
정규식에서 불일치는 REGEXP_EXTRACT의 빈 문자열 결과로 나타날 수 있습니다. 이를 NULL과 같은 값으로 처리할지는 데이터 계약에서 정합니다.