大数据应用技术--日志测试

数据清洗:

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()

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

posted @ 2025-12-15 21:01  f-52Hertz  阅读(0)  评论(0)    收藏  举报