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한 언어기 때문에 가독성이 굉장히 높다.