해결된 질문
작성
·
15
·
수정됨
0
안녕하세요!
좋은 강의 잘 듣고 있습니다!
강의를 듣던 중 궁금한게 생겨서 질문 남깁니다
UDF + broadcast
대신에 아래 방법으로 lookup테이블을 활용해서BROADCAST JOIN
한다면 스파크 내부적으로 다르게 동작하는지,
다르게 동작한다면 어떤 상황에서 각각 이점이 있는지 궁금합니다
lookup_df = spark.createDataFrame(
[(k, v) for k, v in meta.items()],
["occupation_id", "occupation_name"]
)
df_result = interviewer_count.join(
broadcast(lookup_df),
on="occupation_id",
how="left"
)
감사합니다.
답변 2
0
안녕하세요 sgjeong1108님,
좋은 질문이네요.
일단 실행 계층 측면에서 봤을때, broadcast join은 JVM 내부에서 해시 조인, Whole-Stage Codegen 최적화를 가능하게 하지만 UDF + broadcast(파이썬 UDF)는 JVM와 Python를 계속 왕복해서 비효율적이며, 코드젠/컬럼너 실행도 비활성화되어있습니다.
또한 broadcast join는 카탈리스트 최적화, 통계, AQE 활용 가능해서 대체로 빠른 반면에, UDF + broadcast는 필터,프루닝,프레디킷 푸시다운 등 대부분 막혀서 느립니다.
결과적으로 기본은 항상 broadcast join로 설계를 하시되, Lookup 자체가 함수형 변환이어야 하거나, 외부 라이브러리를 꼭 써야 할때나... 조인으로 표현이 어려울 때는 UDF + broadcast를 사용하시면 됩니다.
0
안녕하세요, 인프런 AI 인턴입니다. sgjeong1108님.
Spark를 사용하면서 UDF + broadcast
와 BROADCAST JOIN
의 차이점을 잘 이해하는 것은 성능 최적화에 커다란 도움이 됩니다. 두 방법은 데이터의 처리 방식에 있어 차이가 있습니다.
Broadcast Join:
broadcast()
로 명시적인 브로드캐스트를 구현하면서 데이터의 크기가 특정 임계값보다 작을 경우에 적합합니다. Spark는 10MB를 기본 자동 브로드캐스트 임계값으로 사용합니다.UDF + Broadcast:
UDF
는 사용자 정의 함수를 활용하여 각 레코드별로 연산을 수행합니다. 이는 개별 값을 참조하거나 변환할 때 유용합니다.UDF
사용 시, 개별 레코드에 대해 브로드캐스트된 데이터를 참조하여 복잡한 로직을 처리할 수 있지만, 일반적으로 UDF
는 Spark의 최적화(예: Catalyst optimizer)의 혜택을 받지 못해 성능에 있어 불리할 수 있습니다.BROADCAST JOIN
에 대한 이해를 높이는 데 도움이 될 것입니다.실제로 사용하시는 시나리오에 따라 각 방법의 성능 차이가 있을 수 있습니다. 데이터 크기와 유형, 처리 요구사항에 따라 적절한 방법을 선택하시는 것이 중요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
답변 감사합니다!