Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

문자열 열 변환

문자열을 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 문자열도 구분합니다.