Apache Spark — 느린 잡의 답은 실행 계획과 이벤트 로그에 있다 · DataFrame 과 SQL · 퀴즈
퀴즈: DataFrame 과 SQL
6문항. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
같은 월별 매출 질의를 spark.sql 문자열과 DataFrame API 로 각각 썼다. 성능 차이에 대해 옳은 것은?
- SQL 문자열은 파싱 단계가 더 있어서 늘 느리다
- DataFrame API 만 Catalyst 최적화를 받는다
- SQL 은 JVM 에서, DataFrame 은 파이썬에서 실행된다
- 같은 엔진이 같은 계획으로 바꾸므로 차이가 없다
합계를 내는 groupBy 의 물리 계획을 아래에서 위로 읽을 때 나타나는 순서는?
- Exchange → partial_sum → sum
- partial_sum → Exchange → sum
- sum → Exchange → partial_sum
- Exchange → sum → Exchange
날짜로 정렬한 윈도에서 프레임을 적지 않고 sum 으로 누적합을 냈더니 같은 날짜의 행들이 모두 같은 누적값을 받았다. 이유는?
- 정렬이 있으면 기본 프레임이 범위 기준이라 같은 날짜를 한꺼번에 포함한다
- sum 은 윈도에서 쓰면 파티션 전체 합을 돌려주도록 정해져 있다
- partitionBy 를 빼먹어서 날짜가 같은 행끼리 파티션이 된다
- 날짜 칼럼이 문자열이라 정렬이 무시되었기 때문이다
판매액이 [100, 90, 90, 90, 80] 인 분류에서 rank() 로 매긴 순위로 rank <= 3 을 걸렀다. 남는 행 수는?
- 3줄 — 순위는 늘 겹치지 않는다
- 5줄 — 80 도 3등이 되기 때문
- 4줄 — 90 셋이 공동 2등이다
- 2줄 — 동점은 모두 빠진다
createOrReplaceTempView 로 등록한 뷰를 다른 spark-submit 앱에서 같은 이름으로 조회했더니 테이블을 찾지 못했다. 이유는?
- 뷰 이름은 대문자로만 불러야 하기 때문
- 임시 뷰는 만든 세션에 묶여 세션이 끝나면 사라지기 때문
- 임시 뷰는 첫 행동 뒤에 자동으로 삭제되기 때문
- 뷰가 자료를 메모리에 복사해 두었다가 비웠기 때문
정산용 월간 고유 고객 수에 approx_count_distinct 를 기본값으로 쓰려 한다. 문서에 근거한 판단은?
- 기본 rsd 가 0.05 라 오차가 허용되지 않는 정산에는 맞지 않는다
- 근사 함수도 결과가 정확히 같으니 무조건 근사 쪽을 쓴다
- rsd 를 0.001 로 낮추면 정확한 값보다 빠르고 정확해진다
- 근사 함수는 정수 칼럼에만 쓸 수 있어서 쓸 수 없다