PySpark의 DataFrame
은 SQL 테이블처럼 다른 데이터 프레임 또는 자체에 조인될 수 있습니다. 데이터 프레임은 .join()
메소드를 사용하여 다른 데이터 프레임과 조인됩니다. 이 메소드는 DataFrame
, 조인 제약 조건(예: 조인할 열의 이름) 및 메소드(left
, right
, inner
등)를 사용합니다.
Copied!1 2
# 'key'를 기준으로 'df_left'와 'df_right'를 왼쪽 조인합니다. df_joined = df_left.join(df_right, 'key', 'left')
df_joined
는 이제 df_left.key == df_right.key
에 대한 왼쪽
조인의 결과입니다. PySpark는 자동으로 key
열의 사본 중 하나를 삭제하여 df_joined
에는 key
라는 이름의 열이 하나만 포함되게 합니다.
df_left
와 df_right
에서 조인할 키가 같은 이름을 가지고 있지 않다면, 조인을 수행하기 전에 먼저 이름을 바꾸는 것이 권장됩니다.
조인을 완료하면 충돌이 발생하기 때문에 명시적으로 조인하지 않은 동일한 이름을 가진 모든 필드를 이름을 바꾸거나 삭제해야 합니다. DataFrame
의 모든 열은 다음과 같이 루프 내에서 특정 접두사로 이름을 바꿀 수 있습니다.
Copied!1 2 3 4
# 'df.columns'를 통해 데이터프레임의 모든 열을 순회합니다. for column in df.columns: # 'withColumnRenamed' 함수를 이용해 각 열의 이름을 'some_prefix_'가 추가된 이름으로 변경합니다. df = df.withColumnRenamed(column, 'some_prefix_' + column)
.join()
메소드는 하나의 필드 대신 조인할 필드 목록을 사용할 수 있습니다.
Copied!1 2 3
# 'df_left' 데이터프레임에 'df_right' 데이터프레임을 조인합니다. # 조인 기준은 'column1', 'column2', 'column3' 열이며, 왼쪽 조인을 수행합니다. df_joined = df_left.join(df_right, ['column1', 'column2', 'column3'], 'left')
df_joined
는 이제 column1
, column2
및 column3
에 대한 조인입니다. 다시 말해, 이는 df_left
와 df_right
사이에 열 이름이 일관되다는 가정하에 진행됩니다.
PySpark는 논리 연산자를 사용하여 임의의 표현식을 사용한 조인을 지원합니다. 열 ID
에 대해 조인하려고 하고, 왼쪽 DataFrame
의 날짜 start
가 오른쪽 DataFrame
의 날짜 end
이전이며, 특정 필드 X
의 내용에 따라 오른쪽 DataFrame
의 Y
가 또 다른 값을 포함하는지 여부를 요구하거나 요구하지 않을 수 있다고 가정해 봅시다.
Copied!1 2 3 4 5 6 7
# 한글 주석 key_constraint = df_left.ID == df_right.ID # 왼쪽 데이터 프레임의 ID와 오른쪽 데이터 프레임의 ID가 같은지 확인 date_constraint = df_left.start < df_right.end # 왼쪽 데이터 프레임의 시작 날짜가 오른쪽 데이터 프레임의 종료 날짜보다 이전인지 확인 case_constraint = F.when(df_left.X == 'some_value', df_right.Y == 'some_other_value')\ .otherwise(True) # 왼쪽 데이터 프레임의 X 값이 'some_value'일 경우, 오른쪽 데이터 프레임의 Y 값이 'some_other_value'와 같은지 확인. 그렇지 않으면 True 반환 combined_constraints = key_constraint & date_constraint & case_constraint # 모든 제약 조건을 결합 df_joined = df_left.join(df_right, combined_constraints, 'left') # 왼쪽 데이터 프레임에 오른쪽 데이터 프레임을 결합 (조건에 맞는 행만)
키 또는 다른 제약 조건에 의한 일치 없이 두 데이터프레임 사이의 행의 모든 조합을 생성하기 위해 교차 조인을 사용하십시오. 이는 카르테지안 곱으로도 알려져 있습니다. 교차 조인은 메모리와 성능 문제를 초래할 위험이 있으므로 가능한 한 피해야 합니다.
:::callout{theme=경고 제목="경고"} 결과를 즉시 필터링하려는 경우 교차 조인을 사용하지 마십시오. 대신, 더 효율적인 해결책을 위해 조인 제약 조건에 필터 기준을 포함시키십시오 (위의 고급 임의의 조인 제약 조건 참조). :::
교차 조인을 사용하려면 Code Repositories에서 명시적으로 프로필 CROSS_JOIN_ENABLED
를 가져와야 합니다.
Copied!1 2 3 4 5 6 7 8 9 10
from transforms.api import configure # 프로필에 "CROSS_JOIN_ENABLED"를 추가하여 크로스 조인 작업이 가능하도록 설정합니다. @configure(profile=["CROSS_JOIN_ENABLED"]) @transform_df( ... ) def my_compute_function(input_a, input_b): # input_a와 input_b를 크로스 조인하여 결과를 반환합니다. return input_a.crossJoin(input_b)