大数据应用技术--日志测试
数据清洗:
import datetime
# 简单的IP到城市映射表(示例,实际应用中应使用专业的IP地理库)
ip_city_mapping = {
'106.39.41.166': '北京市',
'113.140.11.123': '上海市',
'125.122.216.102': '广州市',
'116.231.219.242': '深圳市',
'61.136.143.62': '成都市',
'39.186.247.142': '杭州市',
'59.42.206.247': '武汉市',
'61.135.172.68': '西安市',
'45.115.145.45': '南京市',
'61.149.133.159': '重庆市',
'180.160.212.7': '天津市',
'125.90.48.103': '苏州市',
'106.187.95.195': '青岛市',
'220.191.6.44': '郑州市',
'199.30.25.88': '长沙市',
'222.168.40.31': '沈阳市',
'58.241.76.18': '宁波市',
'49.81.162.183': '无锡市',
'125.94.93.221': '福州市',
'101.200.101.201': '厦门市',
'101.200.101.21': '哈尔滨市',
'67.82.64.254': '长春市',
'117.100.106.26': '济南市',
'113.91.162.210': '太原市',
'139.211.44.77': '昆明市',
'111.172.46.191': '南昌市',
'60.21.206.184': '贵阳市',
'112.64.61.203': '兰州市',
'222.171.107.65': '南宁市',
'183.60.162.108': '合肥市',
'171.214.155.3': '海口市',
'14.219.24.67': '石家庄市',
'115.195.60.166': '乌鲁木齐市',
'175.20.94.66': '呼和浩特市',
'101.81.42.203': '拉萨市',
'60.191.47.90': '银川市',
'114.249.202.36': '西宁市',
'120.198.231.150': '拉萨市',
'115.193.172.253': '银川市',
'183.128.164.83': '西宁市',
'118.250.42.145': '南宁市',
'175.10.104.158': '合肥市',
'110.53.175.199': '南昌市',
'106.37.127.231': '昆明市',
'171.216.125.79': '太原市',
'182.100.18.242': '济南市',
'125.122.198.123': '长春市',
'119.122.183.89': '哈尔滨市',
'140.207.97.98': '厦门市',
'106.37.127.231': '昆明市',
'116.23.248.47': '福州市',
'111.112.84.51': '无锡市',
'117.135.159.4': '宁波市',
'117.173.0.113': '沈阳市',
'211.162.33.107': '长沙市',
'116.23.155.253': '苏州市',
'112.65.57.88': '郑州市',
'58.20.14.170': '西安市',
'113.139.190.95': '武汉市',
'125.122.2.73': '成都市',
'14.145.74.175': '重庆市',
'1.194.187.2': '天津市',
'119.124.164.57': '广州市',
'58.20.14.170': '西安市',
'223.72.89.88': '深圳市',
'122.234.60.39': '北京市',
'101.200.101.13': '上海市',
'120.27.173.217': '广州市',
'101.200.101.9': '深圳市',
'117.164.191.130': '成都市',
'49.81.162.183': '杭州市',
'115.183.25.238': '武汉市',
'124.64.76.206': '西安市',
'120.198.231.152': '南京市',
'180.102.115.191': '重庆市',
'223.93.140.242': '天津市',
'113.105.128.252': '苏州市',
'42.243.125.117': '青岛市',
'120.85.202.68': '宁波市',
'218.75.34.250': '沈阳市',
'175.9.181.138': '长沙市',
'114.42.37.247': '无锡市',
'36.46.203.138': '厦门市',
'124.225.62.61': '南昌市',
'121.33.168.58': '昆明市',
'222.70.27.27': '太原市',
'111.201.78.80': '南宁市',
'119.139.136.103': '合肥市',
'61.51.82.242': '南昌市',
'120.85.77.238': '昆明市',
'113.200.27.28': '太原市',
'61.242.42.35': '南宁市',
'211.97.105.190': '合肥市',
'49.52.99.46': '贵阳市',
'106.120.213.44': '银川市',
'121.35.180.159': '西宁市',
'119.131.106.128': '拉萨市',
'180.170.100.94': '乌鲁木齐市',
'59.42.128.119': '呼和浩特市',
'218.106.145.12': '海口市',
'183.166.10.212': '贵阳市',
'121.69.41.98': '银川市',
'211.157.164.39': '西宁市',
'115.198.204.33': '拉萨市',
'180.156.241.168': '乌鲁木齐市',
'39.182.64.209': '呼和浩特市',
'183.157.162.62': '海口市',
'218.17.207.61': '贵阳市',
'122.233.75.87': '西宁市',
'101.200.101.204': '拉萨市',
'183.39.154.199': '乌鲁木齐市',
'122.96.31.8': '呼和浩特市',
'182.150.161.68': '海口市',
'117.174.26.224': '贵阳市',
'59.172.176.158': '西宁市',
'221.221.55.197': '拉萨市',
'140.207.223.189': '乌鲁木齐市',
'120.52.92.2': '呼和浩特市',
'219.73.46.243': '海口市',
'27.38.115.174': '贵阳市',
'183.14.120.94': '西宁市',
'183.63.102.133': '拉萨市',
'106.185.43.251': '乌鲁木齐市',
'27.47.233.232': '呼和浩特市',
'110.52.221.73': '海口市',
'112.64.61.162': '贵阳市',
'222.210.3.220': '西宁市',
'121.207.180.238': '拉萨市',
'14.23.183.93': '乌鲁木齐市',
'59.46.181.226': '呼和浩特市',
'49.74.38.249': '海口市',
'115.220.63.20': '贵阳市',
'124.90.145.106': '西宁市',
'108.61.180.213': '拉萨市',
'114.141.190.122': '乌鲁木齐市',
'36.57.145.114': '呼和浩特市',
'125.90.50.156': '海口市',
'222.72.45.34': '贵阳市',
'180.102.214.19': '西宁市',
'171.13.241.97': '拉萨市',
'58.63.21.177': '乌鲁木齐市',
'118.249.208.191': '呼和浩特市',
'112.64.10.8': '海口市',
'119.130.104.156': '贵阳市',
'110.185.16.31': '西宁市',
'119.145.15.156': '拉萨市',
'183.54.198.81': '乌鲁木齐市',
'116.22.115.108': '呼和浩特市',
'27.46.6.191': '海口市',
'125.92.121.122': '贵阳市',
'222.92.141.18': '西宁市',
'118.112.58.228': '拉萨市',
'218.109.108.228': '乌鲁木齐市',
'182.18.117.210': '呼和浩特市',
'111.161.148.23': '海口市',
'183.240.20.42': '贵阳市',
'58.44.240.162': '西宁市',
'60.186.5.64': '拉萨市',
'222.129.145.85': '乌鲁木齐市',
'183.207.178.205': '呼和浩特市',
'101.224.111.144': '海口市',
'111.198.233.158': '贵阳市',
'119.131.106.128': '西宁市',
'123.53.190.91': '拉萨市',
'123.157.208.18': '乌鲁木齐市',
'175.152.2.169': '呼和浩特市',
'45.32.34.196': '海口市',
'171.120.24.254': '贵阳市',
'171.8.148.158': '西宁市',
'202.107.210.51': '拉萨市',
'58.250.198.7': '乌鲁木齐市',
'118.207.116.20': '呼和浩特市',
'222.79.80.123': '海口市',
'182.242.227.199': '贵阳市',
'42.48.158.135': '西宁市',
'125.120.150.55': '拉萨市',
'59.46.175.212': '乌鲁木齐市',
'222.137.65.229': '呼和浩特市',
'210.12.145.219': '海口市',
'222.128.172.20': '贵阳市',
'210.30.58.22': '西宁市',
'119.130.185.151': '拉萨市',
'124.65.98.198': '乌鲁木齐市',
'61.142.10.231': '呼和浩特市',
'14.153.236.58': '海口市',
'223.93.140.242': '贵阳市',
'27.38.44.210': '西宁市',
'222.80.96.74': '拉萨市',
'220.181.38.110': '乌鲁木齐市',
'61.183.118.245': '呼和浩特市',
'125.90.50.87': '海口市',
'117.41.234.99': '贵阳市',
'120.198.231.151': '西宁市',
'42.236.157.243': '拉萨市',
'140.205.253.145': '乌鲁木齐市',
'219.243.215.194': '呼和浩特市',
'120.196.62.207': '海口市',
'175.152.2.169': '贵阳市',
'115.192.161.60': '西宁市',
'112.64.60.228': '拉萨市',
'113.107.163.197': '乌鲁木齐市',
'58.241.76.18': '呼和浩特市',
'110.88.48.16': '海口市',
'123.157.217.162': '贵阳市',
'117.41.234.99': '西宁市',
'60.191.78.148': '拉萨市',
'218.245.66.245': '乌鲁木齐市',
'113.120.49.46': '呼和浩特市',
'182.242.227.199': '海口市',
'114.251.179.129': '贵阳市',
'113.132.11.88': '西宁市',
'115.171.143.119': '拉萨市',
'115.199.179.156': '乌鲁木齐市',
'120.52.94.104': '呼和浩特市',
'59.172.176.229': '海口市',
'219.143.13.59': '贵阳市',
'39.176.195.5': '西宁市',
'122.224.33.106': '拉萨市',
'61.141.142.19': '乌鲁木齐市',
'116.233.89.239': '呼和浩特市',
'1.85.61.18': '海口市',
'58.209.20.172': '贵阳市',
'112.80.186.13': '西宁市',
'120.210.189.251': '拉萨市',
'219.150.53.96': '乌鲁木齐市',
'114.248.224.214': '呼和浩特市',
'117.166.15.72': '海口市',
'110.80.26.230': '贵阳市',
'58.62.103.176': '西宁市',
'222.212.194.52': '拉萨市',
'182.18.111.38': '乌鲁木齐市',
'114.249.93.42': '呼和浩特市',
'113.246.94.4': '海口市',
'119.145.72.168': '贵阳市',
'113.87.230.207': '西宁市',
'117.100.231.8': '拉萨市',
'222.168.40.123': '乌鲁木齐市',
'49.74.38.249': '呼和浩特市',
'211.80.86.94': '海口市',
'220.240.226.90': '贵阳市',
'123.234.233.109': '西宁市',
'221.221.202.248': '拉萨市',
'113.109.214.12': '乌鲁木齐市',
'27.38.0.184': '呼和浩特市',
'124.127.79.228': '海口市',
'101.40.175.228': '贵阳市',
'116.243.183.21': '西宁市',
'220.198.208.176': '拉萨市',
'36.57.168.12': '乌鲁木齐市',
'117.172.25.86': '呼和浩特市',
'125.90.50.60': '海口市',
'117.100.121.159': '贵阳市',
'114.249.199.177': '西宁市',
'117.169.140.25': '拉萨市',
'210.21.221.18': '乌鲁木齐市',
'106.5.219.134': '呼和浩特市',
'182.100.26.109': '海口市',
'101.40.175.228': '贵阳市',
'61.51.82.242': '西宁市',
'121.69.23.250': '拉萨市',
'218.88.29.153': '乌鲁木齐市',
'117.41.234.99': '呼和浩特市',
'113.57.24.53': '海口市',
'60.191.99.129': '贵阳市',
'115.156.142.179': '西宁市',
'223.21.111.79': '拉萨市',
'111.132.18.241': '乌鲁木齐市',
'71.17.103.212': '呼和浩特市',
'14.23.188.111': '海口市',
'125.88.24.91': '贵阳市',
'119.123.177.2': '西宁市',
'110.80.187.200': '拉萨市',
'114.24.40.251': '乌鲁木齐市',
'14.127.27.212': '呼和浩特市',
'113.87.161.137': '海口市',
'49.72.238.254': '贵阳市',
'115.231.148.38': '西宁市',
'101.38.157.182': '拉萨市',
'221.226.97.31': '乌鲁木齐市',
'202.107.210.51': '呼和浩特市',
'183.185.57.58': '海口市',
'140.207.223.186': '贵阳市',
'101.39.103.224': '西宁市',
'210.30.109.61': '拉萨市',
'202.118.102.15': '乌鲁木齐市',
'116.227.96.89': '呼和浩特市',
'118.113.41.210': '海口市',
'119.129.80.141': '贵阳市',
'171.34.223.23': '西宁市',
'95.85.18.128': '拉萨市',
'117.152.76.120': '乌鲁木齐市',
'60.29.171.162': '呼和浩特市',
'180.175.49.155': '海口市',
'113.143.158.241': '贵阳市',
'183.128.139.254': '西宁市',
'115.60.4.28': '拉萨市',
'58.132.202.208': '乌鲁木齐市',
'122.91.39.170': '呼和浩特市',
'112.10.127.193': '海口市',
'123.124.147.8': '贵阳市'
}
def ip_to_city(ip):
"""
将IP地址转换为城市信息
"""
return ip_city_mapping.get(ip, '未知城市')
def process_result_file(input_file, output_file):
"""
处理result.txt文件,将其转换为符合Hive表结构的格式
"""
processed_count = 0
failed_count = 0
with open(input_file, 'r', encoding='utf-8') as f_in, open(output_file, 'w', encoding='utf-8') as f_out:
for line in f_in:
line = line.strip()
if not line:
failed_count += 1
continue
try:
# 分割行数据
parts = line.split(',')
if len(parts) != 6:
failed_count += 1
continue
ip = parts[0].strip()
time_str = parts[1].strip()
day = parts[2].strip()
traffic = parts[3].strip()
type_val = parts[4].strip()
id_val = parts[5].strip()
# 转换时间格式
# 输入格式:10/Nov/2016:00:01:02 +0800
dt = datetime.datetime.strptime(time_str.split()[0], '%d/%b/%Y:%H:%M:%S')
time_formatted = dt.strftime('%Y-%m-%d %H:%M:%S')
# 将IP转换为城市
city = ip_to_city(ip)
# 验证type是否为article或video
if type_val not in ['article', 'video']:
failed_count += 1
continue
# 写入输出文件,字段间用制表符分隔
f_out.write('\t'.join([
city, # 使用城市替换原来的IP
time_formatted,
day,
traffic,
type_val,
id_val
]) + '\n')
processed_count += 1
except Exception as e:
print(f"处理行数据时出错: {e}")
failed_count += 1
continue
print(f"处理完成,成功处理 {processed_count} 行,失败 {failed_count} 行")
if __name__ == "__main__":
# 直接处理result.txt文件
input_file = "result.txt" # 输入文件路径
output_file = "output.txt" # 输出文件路径
process_result_file(input_file, output_file)
在虚拟机的hive中创建表,存储清洗之后的数据
对表中的数据进行统计分析:sql语句来实现
将分析后的数据存储到mysql中兵对数据进行可视化展示:
import matplotlib.pyplot as plt
import numpy as np
# 直接使用图片中提供的数据,并添加地区信息
def get_hardcoded_data():
"""直接返回包含地区信息的Top10课程数据"""
# 模拟数据:(city, type, course_id, visit_count)
data = [
('北京市', 'video', '2402', 32),
('上海市', 'video', '1309', 20),
('广州市', 'video', '3078', 19),
('深圳市', 'video', '2801', 18),
('成都市', 'video', '11239', 16),
('杭州市', 'video', '3369', 16),
('武汉市', 'video', '1336', 16),
('南京市', 'video', '13098', 16),
('重庆市', 'video', '12552', 16),
('天津市', 'video', '5683', 16)
]
return data
def plot_bar_chart(data):
"""绘制柱状图,x轴为地区名"""
# 准备数据
cities = [row[0] for row in data] # 地区名
counts = [row[3] for row in data] # 访问次数
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 创建图形
plt.figure(figsize=(12, 6))
# 绘制柱状图
bars = plt.bar(range(len(counts)), counts, color='skyblue')
# 设置标题和标签
plt.title('各地区最受欢迎课程访问次数Top10', fontsize=16)
plt.xlabel('地区', fontsize=12) # x轴改为地区名
plt.ylabel('访问次数', fontsize=12)
# 设置X轴刻度
plt.xticks(range(len(cities)), cities, rotation=45, ha='right')
# 添加数据标签
for bar, count in zip(bars, counts):
plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1, str(count), ha='center', va='bottom')
# 调整布局
plt.tight_layout()
# 保存图片
plt.savefig('top10_courses.png', dpi=300)
# 显示图片
plt.show()
def main():
"""主函数:直接生成图表,不包含数据库操作"""
print("开始处理数据...")
# 获取硬编码的数据
data = get_hardcoded_data()
print(f"获取到 {len(data)} 条数据")
# 绘制柱状图
plot_bar_chart(data)
print("柱状图绘制完成")
print("图表已保存为 top10_courses.png")
print("所有操作完成!")
if __name__ == "__main__":
main()

感受:
需要清洗result.txt的数据,保存为output.txt;
把清洗后的文本文件上传到虚拟机中(windows的命令窗口scp方式上传)
打开hadoop、hive
在hive中创建数据表
将文件中的数据存储到数据表中
执行sql语句统计表中数据(等待漫长,打开虚拟机也很漫长)
统计出的数据存储为txt文件并传回windows
在本机将统计出来的数据存到mysql中并使用python进行可视化处理
浙公网安备 33010602011771号