利用python对数据分流

来源:互联网 发布:淘宝店铺关注人数越多 编辑:程序博客网 时间:2024/04/28 14:56

业务需求:hive表中包含了顺丰的所有的运单流向(北京到深圳为一个流向,全国大约十万个流向),现将数据分流,将每一个流向写入一个文件中

 report_dt                            报表时间
         src_area_code                 始发地区代码
         src_dept_name      始发地区名称
         dest_area_code      目的地区代码
         dest_dept_name             目的地区名称
         first_segment_zone        收件网点
         last_segment_zone     送件网点
         send_city     收件城市流向字段
         arrive_city     寄件城市  流向字段
         product_type                   产品类型
         cost_tm    运单时长
         full_route_3   路由1 
         full_route_2 路由2
         full_route_1 路由3
         id id
         pt_month 分区字段
         pt_date 子分区

数据量:5G

分析:1 用hive sql 将流向一个一个导出,按每个流向3分钟计算,超过半年的时间才能完成,pass

    2 开始想过,利用hive 动态分区功能,将每一个流向放入一下分区中,但是hive不支持这么多分区,pass!

    3 利用MR编程处理,处理成本不划算!待选

    4 5G文件,利用python 进行分流!首选


代码实现:

# -*- coding: utf-8 -*-"""Created on Mon Feb 20 10:55:44 2017数据分流@author: 80002419"""##主要用到的三方包是pandasimport pandas as pdimport time#time.sleep(18000)t1 = time.time()# 定义一个将df对象保存到本地的对象 ,文件以追加模式 'a' 打开def savefile(df,file_name):    '''    将数据保存到本地     @df:要保存的Dataframe     @file_name:保存文件名    '''    df.to_csv(r'E:\python\static_data\%s.csv' %file_name,mode = 'a')#将hive数组文件,重定向到到本地 命名 yx20170228.csv##数据字段 按表结构命名,columns=['report_dt',         'src_area_code',         'src_dept_name',         'dest_area_code',         'dest_dept_name',         'first_segment_zone',         'last_segment_zone',         'send_city',         'arrive_city',         'product_type',         'cost_tm',         'full_route_3',         'full_route_2',         'full_route_1',         'id',         'pt_month',         'pt_date',]# 控制while 循环变量loop = True##文件执行跟踪变量prosess = 0# 利用pandas read_csv 读出源文件 ,因为文件过大设置参数iterator=True,等到可以迭代的df 对象:readerreader = pd.read_csv('E:\python\yx20170228.csv',iterator=True,names=list(columns),encoding = 'gbk')# 处理逻辑主体:while loop:    try:        df = reader.get_chunk(1000000)  ## 分块读取大文件对象,get_chunk(1000000)每次读取1G内容        list = df.groupby(['send_city','arrive_city']) # 将df对象按 df.groupby 分组,        for name,group in list:            print(name,prosess)            savefile(group,str(name[0])+'-'+ str(name[1])) #分别把同一组的的数据写到同一个文件中去!        prosess += 1        except  StopIteration:        loop = False # reader 迭代完,就结束循环        print('Iter is shoped!')t = time.time() - t1print(t)




总共花费时间:5900+s

花费时长较长,有待优化