1.前言
本章旨在运用spark集群分析csgo时期职业选手数据集,通过spark各个模块分析职业选手的游戏数据并进行可视化。
2.系统设计思路
2.1系统框架图
2.2模块功能详解
数据清洗
删除不需要的列,对于队伍为空的数据,添加"NO",处理特殊字符。
rating排序
将数据转换成DataFrame根据rating排序,若rating相同则按照ADR排序,若ADR相同则按照先后顺序排序将排序结果写入Spark SQL将rating排序前三的热门选手数据输出为一个文件。
数据可视化
读取top3.csv文件分析3位选手的击杀数据生成击杀数据的扇形图
Spark SQL库的信息查询与分析
查询中国的所有玩家的基本信息,查询G2中杀敌数最多的玩家,计算所有玩家的K/D均值,查询使用狙击枪杀敌数最多的前五名玩家,查询在每回合中伤害最高的玩家的昵称和伤害数值。
数据流处理
使用Structured Streaming组件模拟动态输出将playerpositionanalysis原始数据输出对职位数量做词频统计并输出。
3.系统功能实现
3.1系统开发(运行)坏境
硬件环境:虚拟机模拟
软件环境:SecureCRT 9.4,PyCharm 2023.3.2,VMware Workstation Pro,ubuntu-18.04.5-live-server-amd64.iso,spark-2.4.0-bin-without-hadoop.tgz,hadoop-2.7.4.tar.gz,mysql-connector-j-8.3.0.jar,Anaconda3-2020.11-Linux-x86_64.sh。
3.2功能模块
3.2.1数据清洗
实现功能
使用RDD将将数据集不要的列删除,处理数据文件中的空值和特殊字符并生成一个新的csv文件。
核心代码
from pyspark import SparkContext, SparkConf
import os
# 设置JAVA_HOME环境变量
os.environ['JAVA_HOME'] = "/home/spark006/servers/jdk"
# 设置Spark Context
conf = SparkConf().setAppName("DataCleaningWithRDD")
sc = SparkContext(conf=conf)
# 读取数据
raw_data = sc.textFile("file:///home/spark006/data/cswork/csgo_players.csv")
# 获取header
header = raw_data.first()
data = raw_data.filter(lambda row: row != header)
# 切分数据
data_split = data.map(lambda line: line.split(","))
# 删除不需要的列
columns_to_keep = [0, 1, 2, 3, 4, 5] # 这些是需要保留的列索引
data_filtered = data_split.map(lambda row: [row[i] for i in columns_to_keep])
# 填充current_team为空的行
current_team_index = 5 # current_team在第6列
data_filled = data_filtered.map(lambda row: row[:current_team_index] + ["NO" if row[current_team_index] == "" else row[current_team_index]] + row[current_team_index + 1:])
# 清洗特殊符号
import re
def clean_special_chars(row):
row[0] = re.sub('[^a-zA-Z0-9\s]', '', row[0]) # 清洗real_name
row[1] = re.sub('[^a-zA-Z0-9\s]', '', row[1]) # 清洗teams
return row
data_cleaned = data_filled.map(clean_special_chars)
# 转换回CSV格式并保存
data_cleaned.map(lambda row: ",".join(row)).saveAsTextFile("file:///home/spark006/data/cswork/cleaned_dataset_rdd.csv")
# 关闭Spark Context
sc.stop()