문자열 열 변환
문자열을 Python으로 수집하지 않고 Spark 열 표현식으로 처리합니다. 아래 API는 from pyspark.sql import functions as F로 가져옵니다. 열을 받는 위치의 문자열은 보통 열 이름이고, 구분자나 정규식 인자는 실제 문자열 값입니다.
대소문자와 결합
| 함수 | 동작 |
|---|---|
F.initcap(col) | 단어의 첫 글자를 대문자로 변환 |
F.lower(col) | 소문자로 변환 |
F.upper(col) | 대문자로 변환 |
F.concat(*cols) | 여러 열을 연결 |
F.concat_ws(sep, *cols) | 지정한 구분자 sep로 문자열 열을 연결 |
F.split(str, pattern) | 정규식 패턴을 기준으로 나누어 배열 생성 |
concat에 고정 문자열을 넣으려면 F.lit()로 표현합니다. concat_ws의 첫 인자 sep는 구분자 자체입니다. split의 pattern은 단순 구분 문자열과 달리 정규식의 특수 문자를 해석합니다.
from pyspark.sql import functions as F
def name_fields(df):
return df.select(
F.concat_ws(" ", F.col("first_name"), F.col("last_name")).alias("full_name"),
F.concat(F.lit("USER-"), F.col("user_id")).alias("display_id"),
)
위치와 부분 문자열
| 함수 | 동작 |
|---|---|
F.instr(str, substr) | 문자열 열에서 substr의 첫 위치 |
F.locate(substr, str, pos=1) | pos 이후에서 substr의 첫 위치 |
F.substring(str, pos, len) | pos부터 지정 길이의 부분 문자열 |
F.substring_index(str, delim, count) | 구분자의 지정 번째 출현을 기준으로 부분 문자열 선택 |
문자열 위치는 1부터 시작합니다. instr/locate는 일치가 없으면 0을 반환합니다. substring_index의 count가 양수이면 왼쪽에서 세어 마지막 구분자 왼쪽을, 음수이면 오른쪽에서 세어 구분자 오른쪽을 반환합니다. 구분자 검색은 대소문자를 구분합니다. 예를 들어 a.b.c.d에서 substring_index(..., ".", 2)는 a.b, count -3은 b.c.d입니다.
공백과 채움
| 함수 | 동작 |
|---|---|
F.lpad(col, len, pad) | 왼쪽을 pad로 채워 지정 길이로 만듦 |
F.rpad(col, len, pad) | 오른쪽을 pad로 채워 지정 길이로 만듦 |
F.ltrim(col) | 왼쪽 끝 공백 제거 |
F.rtrim(col) | 오른쪽 끝 공백 제거 |
F.trim(col) | 양쪽 끝 공백 제거 |
정규식
| 함수 | 동작 |
|---|---|
F.regexp_extract(str, pattern, idx) | 정규식에서 지정한 캡처 그룹 추출 |
F.regexp_replace(str, pattern, replacement) | 일치하는 부분을 replacement로 치환 |
from pyspark.sql import functions as F
def clean_codes(df):
return df.select(
F.upper(F.trim("code")).alias("normalized_code"),
F.regexp_extract("code", r"([A-Z]+)-(\d+)", 2).alias("number_part"),
F.regexp_replace("description", r"\s+", " ").alias("description"),
)
예제는 code와 description 문자열 열을 받으며 숫자 부분도 문자열로 반환합니다. 필요한 경우 별도로 숫자형으로 cast합니다.
인코딩, 표시와 유사도
| 함수 | 결과와 의미 |
|---|---|
F.ascii(col) | 첫 문자의 수치 코드 |
F.base64(col) | 바이너리를 Base64 문자열로 인코딩 |
F.unbase64(col) | Base64 문자열을 바이너리로 복원 |
F.bin(col) | 정수의 이진 표현 문자열 |
F.conv(col, fromBase, toBase) | 문자열 숫자의 진법 변환 |
F.decode(col, charset) | 바이너리를 지정 문자 집합의 문자열로 디코딩 |
F.encode(col, charset) | 문자열을 지정 문자 집합의 바이너리로 인코딩 |
F.format_number(col, d) | HALF_EVEN으로 d자리까지 반올림한 숫자 표시 문자열 |
F.format_string(format, *cols) | printf 형태의 형식 문자열 적용 |
F.hex(col) | 문자열/바이너리/정수 등의 16진 표현 |
F.unhex(col) | 16진 문자열을 바이너리로 변환 |
F.length(col) | 문자열의 문자 길이. 바이너리는 바이트 길이 |
F.levenshtein(left, right) | 두 문자열의 Levenshtein 편집 거리 |
F.repeat(col, n) | 문자열을 n번 반복 |
F.reverse(col) | 문자열 순서 반전 |
F.translate(srcCol, matching, replace) | matching의 문자를 대응하는 replace 문자로 치환 |
encode/decode의 문자 집합에는 US-ASCII, ISO-8859-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16을 사용할 수 있습니다. Base64와 16진 표현은 인코딩이며 암호화 기능이 아닙니다. 숫자 계산을 이어가야 할 열과 사람이 읽는 format_number 문자열도 구분합니다.