매출 사용자 10명 알아내기(RANKING)
- user_session_channel, session_timestamp, session_transaction 테이블 사용
- 다음 형태의 결과를 만들어보기
- 매출은 refund 포함
- 3개의 테이블을 각기 데이터프레임으로 로딩
- 데이터프레임별로 테이블 이름 지정
- Spark SQL로 처리
- 먼저 조인 방식 결정
- 조인키
- 조인방식(INNER, LEFT, RIGHT, FULL)
- 다음으로 간단한 지표부터 계산
- 먼저 조인 방식 결정
1. Redshift 커넥트
# Redshift와 연결해서 DataFrame으로 로딩하기
url = "jdbc:redshift://learnde.cduaw970ssvt.ap-northeast-2.redshift.amazonaws.com:5439/dev?user=아이디&password=비밀번호"
df_user_session_channel = spark.read \
.format("jdbc") \
.option("driver", "com.amazon.redshift.jdbc42.Driver") \
.option("url", url) \
.option("dbtable", "raw_data.user_session_channel") \
.load()
df_session_timestamp = spark.read \
.format("jdbc") \
.option("driver", "com.amazon.redshift.jdbc42.Driver") \
.option("url", url) \
.option("dbtable", "raw_data.session_timestamp") \
.load()
df_session_transaction = spark.read \
.format("jdbc") \
.option("driver", "com.amazon.redshift.jdbc42.Driver") \
.option("url", url) \
.option("dbtable", "raw_data.session_transaction") \
.load()
2. 임시 테이블 생성
df_user_session_channel.createOrReplaceTempView("user_session_channel")
df_session_timestamp.createOrReplaceTempView("session_timestamp")
df_session_transaction.createOrReplaceTempView("session_transaction")
df_user_session_channel.show(5)
df_session_timestamp.show(5)
df_session_transaction.show(5)
3. 총 매출이 가장 많은 사용자 찾기
op_rev_user_df = spark.sql("""
SELECT userid,
SUM(str.amount) revenue,
SUM(CASE WHEN str.refunded = False THEN str.amount END) net_revenue
FROM user_session_channel usc
JOIN session_transaction str ON usc.sessionid = str.sessionid
GROUP BY 1
ORDER BY 2 DESC
LIMIT 10""")
4. 총 매출이 가장 많은 사용자 찾기(RANK)
top_rev_user_df2 = spark.sql("""
SELECT
userid,
SUM(amount) total_amount,
RANK() OVER (ORDER BY SUM(amount) DESC) rank
FROM session_transaction st
JOIN user_session_channel usc ON st.sessionid = usc.sessionid
GROUP BY userid
ORDER BY rank
LIMIT 10""")
- RANK() OVER (ORDER BY SUM(amount) DESC) rank
- 데이터프레임 API로도 가능하지만, 사람마다 다른 방법일 가능성이 높으며, 가독성이 떨어진다.
- SPARK SQL 관점에서 볼 때도 최적화가 굉장히 힘들다.
- 사람마다 SQL 코드 품질이 다를 수 있지만 DECLARATIVE한 언어기 때문에 가독성이 굉장히 높다.
- 비개발자도 이해할 수 있다.
'데이터 엔지니어링 > Spark' 카테고리의 다른 글
20. SPARK SQL(Windowing) (0) | 2023.08.22 |
---|---|
19. SPARK SQL(Redshift Connect, Grouping) (0) | 2023.08.22 |
17. SparkSQL(JOIN - DataFrame, SQL) (0) | 2023.08.21 |
16. SparkSQL(udf 활용 dataframe 가공 및 spark sql 활용 집계) (1) | 2023.08.19 |
15. Spark SQL(UDF, Pandas UDF Scalar) (0) | 2023.08.19 |