按照现在流行的话来说,加了个学习社群,会有人抛出各式各样的问题,可以用shell解决,也可以用python。
一、微博数据分析
某社交网络数据,完成以下任务:
下载微博1天数据,地址:http://101.236.63.184:12345/weibo/
* weibo.top10wan,测试文件,包含10万条数据记录
* weibo.all,生产文件,千万量级数据记录
* 实验代码在测试文件上跑,最终在生产文件上跑出结果
任务一:算出微博1天数据总量;微博发文user_id总量(uniq的user_id的数量);微博文章总量(uniq的weibo_id的总量)
* 思路:读取文件,遍历每一行,统计行数;
* 获取user_id和weibo_id作为key存入dict,遇到相同key,value++
任务二:计算发微博(weibo_id)最多的Top 100用户
* 将user_id按照dict的value排序,输出dict即可
根据获得到的文件,稍微观察下格式,weibo数据字段和含义,在文件中字段依次排列,用\t隔开。
| 字段 | 列说明 | data |
|:------------------|:--------------------------------|:------|
|id |自增字段,全局唯一 |19341526007
|crawler_time |抓取时间 |2018-05-17 00:00:00
|crawler_time_stamp |抓取时间戳 |1526486400000
|is_retweet |是否转发:1表示是转发、0表示原创 |1
|user_id |本条微博的发文ID |1874517592
|nick_name |本条微博的发文用户屏幕名 |Wuli小婷婷儿
|tou_xiang |本条微博的发文用户的头像URL |https://tvax1.sinaimg.cn/crop.0.0.996.996.50/6fbade58ly8fn4pgftkr8j20ro0rp0uw.jpg
|user_type |本条微博的发文用户的类型:黄V、蓝V、会员用户、达人、普通用户|普通用户
|weibo_id |本条微博的ID |4240286638900436
|weibo_content |本条微博的内容 |转发微博
|zhuan |本条微博的转发数 |0
|ping |本条微博的评论数 |0
|zhan |本条微博的被赞数 |0
|url |本条微博的URL |GgU2rBlpq
|device |本条微博的发文设备 |够快才畅快vivo X6
|locate |本条微博的签到地点 |
|time |本条微博的发文时间 |2018-05-16 12:56:18
|time_stamp |本条微博的发文时间戳 |1526446578
|r_user_id |被转发用户ID |1742566624
|r_nick_name |被转发用户屏幕名 |思想聚焦
|r_user_type |被转发用户类型:黄V、蓝V、会员用户、达人、普通用户|金V
|r_weibo_id |被转发微博ID |4240212839930967
|r_weibo_content |被转发微博内容 |暖心漫画:我欣赏女人这样活着。[心]
|r_zhuan |被转发微博转发数 |2737
|r_ping |被转发微博评论数 |451
|r_zhan |被转发点赞数 |6992
|r_url |被转发微博URL |GgS7pFFuT
|r_device |被转发微博的设备 |微博 weibo.com
|r_location |被转发微博的签到 |
|r_time |被转发微博的日期 |2018-05-16 08:03:03
|r_time_stamp |被转发微博的时间戳 |1526428983
|pic_content |微博配图,如果是转发型微博,则pic_content是原微博的配图|
二、Python代码实现
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
weibo_file = open('weibo.top10wan')
line_count = 0
user_dict = dict()
weibo_dict = dict()
for line in weibo_file:
line_count += 1
# 对于后面部分存在切分错误
weibo_item_list = line.split()
user_id = weibo_item_list[5]
weibo_id = weibo_item_list[9]
if user_dict.get(user_id) is None:
user_dict.setdefault(user_id, 1)
else:
user_dict[user_id] = int(user_dict[user_id]) + 1
if weibo_dict.get(weibo_id) is None:
weibo_dict.setdefault(weibo_id, 1)
else:
weibo_dict[weibo_id] = int(weibo_dict[weibo_id]) + 1
sort_user_list = sorted(user_dict.items(), key=lambda s: s[1], reverse = True)
print("文件总行数:%s" % (line_count))
print("微博发文用户总量:%s" % (len(user_dict)))
print("微博文章总量:%s" % (len(weibo_dict)))
print("发微博最多的Top-10用户")
for k,v in sort_user_list[:10]:
print("user_id:%scount:%s" % (k, v))
结果显示。
文件总行数:100000
微博发文用户总量:47661
微博文章总量:96688
发微博最多的Top-10用户
user_id:1036713140 count:42
user_id:5206650942 count:40
user_id:1750349294 count:38
user_id:6529707947 count:38
user_id:2112339023 count:36
user_id:1986954045 count:26
user_id:1668926483 count:25
user_id:1664176597 count:24
user_id:1267454277 count:23
user_id:5044511176 count:23
三、shell方式解决
# 微博数据总量
cat weibo.top10wan | wc -l
wc -l weibo.top10wan
# 微博发文user_id总量
cat weibo.top10wan | awk -F"\t" '{ print $5 }' | sort | uniq | wc -l
# 微博文章总量
cat weibo.top10wan | awk -F"\t" '{ print $9 }' | sort | uniq | wc -l
四、待解决问题
千万级别场景。