业务需求: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花费时长较长,有待优化