假设通过对海量的原始数据后分析得到这样的数据:
[(id,node,val)(id,node,val)...]
就是依次为 用户id,所在服务器,数值 这样的元组,然后要根据服务器分开,再依靠val大小进行排序,然后写入excel中。
或者产生[{"id":xxx,"node":xxx,"val":xxx},{"id":xxx,"node":xxx,"val":xxx}...]
如果是只有一组kv,可以通过sorted的方式进行排序,但是现在node的名称是未知的,这些服务器名每天都可以能会发生变化。当我获取到这样的数据后,如何根据服务器名称分开,再排序数据呢?
这里主要卡在,node本身的名称并不是固定的,比如你先创建n个列表,把相同节点的数据放进去,但你不知道要创建多少个列表。而且之后在将处理后的数据写入excel时,势必要用到循环。
这样循环套循环,而且无论是数据分类后,还是排布后的新数据组名称都不是确定的。即便使用exec命令也无法满足需要啊
过去多啦不再A梦2017-06-12 09:24:19
from collections import defaultdict
d = defaultdict(list)
data = [(id,node,val),(id,node,val)...]
# 按node进行分组
for x in data:
d[x[1]].append(x)
# 将分组数据依次写入excel
for _, v in d.iteritems():
# 排序
tmp = sorted(v, key=lambda x: x["val"], reverse=True/False)
# 写入excel
write_to_excel(tmp)
另外其实可以将数据按id, node, val 全部写入csv文件
通过linux的awk, uniq, sort 等命令工具写一个shell脚本, 也是很快的
还有关于你的海量数据究竟有多大, 在哪个数量级,没有明确, 如果数据量真的很大, 用上面的python代码内存不够用也是可能的, 这个需要你自己估算下
我想大声告诉你2017-06-12 09:24:19
如果我正确理解了你的需求的话,可以用字典,字典的键是node的名称,字典的值是由项组成的列表:
data = [{"id":xxx,"node":xxx,"val":xxx},{"id":xxx,"node":xxx,"val":xxx}...]
result = {}
for data_item in data:
node_name = data_item["node"]
if node_name in result.keys():
result[node_name].append(data_item)
else:
result[node_name] = [data_item]
之后再根据键(服务器名称)取出字典中的每一项的值(就是数据列表),对其sort加lambda根据每一项中的某个值进行排序。