利用python对数据分流

本文转自https://blog.csdn.net/u014770372/article/details/72819914
仅个人学习使用,侵删
业务需求: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值