이번 글에서는 spark에서 데이터를 불러와 spark sql을 사용해본 것에 대해 작성하려고 한다.
시작하기 앞서 zeppelin을 이용하여 실습을 진행했는데, 이에 대해 먼저 소개를 해야할 것 같다.
목차는 다음과 같다.
1. Apache Zeppelin
2. HDFS에서 데이터 불러오기
3. SQL쿼리 실행
4. 마무리
Apache Zeppelin
일단 Zeppelin은 Spark를 통한 데이터 분석의 불편함을 Web 기반의 notebook을 통해 해결해보고자 만들어진 툴이다.
기존의 Spark 환경에서는 명령어를 입력하고 결과를 출력하는 방식으로 작업이 진행되어 쿼리 결과나 분석 과정을 확인하는데 불편함이 있었다.
하지만 Zeppelin은 웹 인터페이스를 통해 이러한 문제를 해결하고 작업을 진행할 수 있는 환경을 제공한다.
따라서, 이는 웹 기반 인터페이스를 통해 쉽게 코드 작성 및 실행할 수 있어 직관적이고 효율적이며 팀원들과 notebook을 공유할 수 있어 실시간으로 협업도 가능하다.
나중에 Zeppelin 설치에 관한 글도 포스팅해야겠다.
HDFS에서 데이터 불러오기
실습을 진행하기 위해 먼저 데이터를 불러와야 했는데, 마땅한 데이터가 없어 최근 토이 프로젝트로 진행했던 칼바람나락 승패 예측을 위해 모아둔 데이터를 활용하기로 했다.
다양한 형식의 데이터를 읽을 수 있지만, csv 파일을 사용했다.
위 코드는 SparkSQL-Pr.이라는 SparkSession을 생성하고, hdfs에 저장된 champion_81.csv 파일을 읽어 DataFrame으로 변환 후 첫 20개의 데이터를 출력하여 파일이 제대로 로드되었는지 확인하는 코드이다.
champion_81.csv 파일은 리그오브레전드의 이즈리얼이라는 챔피언의 칼바람나락 매치 정보를 직접 모아둔 데이터이다.
각 column에 대해 설명하자면 다음과 같다:
- game_duration: 게임 진행 시간
- win: 승리 여부
- item0: 사용한 아이템0
- item1: 사용한 아이템1
- item2: 사용한 아이템2
- item3: 사용한 아이템3
- item4: 사용한 아이템4
- item5: 사용한 아이템5
- item6: 사용한 아이템6
- kill: kill을 몇 번 했는지
- death: 몇 번 죽었는지
- assist: assist를 몇 개 했는지
- total_damage_to_champion: 챔피언에 총 가한 딜량
- total_damage_taken: 총 받은 피해량
SQL쿼리 실행
데이터를 불러왔으니 이제 sql을 작성해보자.
sql을 작성하기 전 createOrReplaceTempView 메서드를 사용해 DataFrame을 임시 테이브로 등록하고, SQL 쿼리를 실행할 수 있다.
df = spark.read.option("header", "true").csv(f"hdfs://MN:9000/data/champion_81.csv")
df.createOrReplaceTempView("df")
sql 쿼리를 실행할 준비가 되었으니, 일단 간단히 최대 kill 수를 확인해보는 쿼리를 작성했다.
기본적인 SQL을 사용할 수 있다는 것이 신기한 것 같다.
결과를 확인해 보니 한 판에 40킬이나 했다...
그렇다면, 다음으로 40킬을 했을 때 그 판을 승리했는지 확인해보자. 이를 위해 win column을 조회하는 쿼리를 작성했다.
결과를 보면 40킬을 기록한 게임은 승리한 게임이란 것을 확인할 수 있다.
다음으로는, 챔피언에게 가한 피해량이 제일 큰 게임을 조회하는 쿼리를 작성했다.
제일 높은 챔피언에게 가한 피해량은 122603이며, 이 사람이 kill을 40번이나 했다.
게임 진행시간은 28분 정도 소요된 것도 확인할 수 있다.
다음으로는 평균 kill, death, assist와 평균 kda를 조회해봤다.
이즈리얼 사용자들의 평균 kill은 11, 평균 death는 8, 평균 assist는 20.5정도 되는 것을 확인할 수 있었다.
또한 평균 kda는 3.87 정도로 나쁘지 않은 kda를 기록했다.
다음으로는 가장 많이 선택한 아이템과 각 아이템을 갔을 때의 승률을 조회해봤다.
유저들은 3042, 3078, 3158 아이템을 많이 선택하는 것 같다. 승률은 아이템 별로 45~55%를 나타낸다.
3042, 3078과 3158 아이템은 각각 무라마나, 삼위일체, 아이오니아 장화이다.
이외에도 쇼진의 창 아이템은 55.16%에 승률을 기록했고, 몰락한 왕의 검이 45.54%의 승률을 기록했다.
마지막으로, 이즈리얼 챔피언의 승률을 조회해봤다.
결과를 확인해 봤을때 50.89%로 50%보다 약간 높은 승률을 기록하는 것을 확인할 수 있었다.
마무리
이번 글에서는 Zeppelin을 사용하여 간단하게 SparkSQL을 사용해본 실습에 대해 포스팅하였다.
SparkSQL은 대규모 데이터 분석에 유용한 것 같고, Zeppelin을 통해 활용도를 더욱 높일 수 있는 것 같다.
또한, Python환경이지만 DataFrame에 SQL 쿼리문을 사용할 수 있고 여기에 Spark의 분산 처리 능력을 활용할 수 있다고 생각하니 신기했다.
다음에는 SparkML에 대한 실습 내용도 포스팅할 예정이다.
'Data Engineering > Spark' 카테고리의 다른 글
[Spark] Apache Spark 설치 (2) | 2024.12.09 |
---|---|
[Spark] What is RDD, DataFrame, Dataset? (0) | 2024.12.09 |
[Spark] Spark Ecosystem과 Spark Architecture (1) | 2024.12.06 |
[Spark] Apache Spark(아파치 스파크) 개요 (1) | 2024.12.05 |