Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

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과 같은 값으로 처리할지는 데이터 계약에서 정합니다.