利用python对数据分流

业务需求: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
"""
##主要用到的三方包是pandas
import pandas as pd
import 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 对象:reader
reader = 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() - t1
print(t)







总共花费时间:5900+s

花费时长较长,有待优化

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

crystalnsd

万水千山总是情,支持一下行不行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值