背景:
hadoop平台上通过hive整理模型预测数据,需要将多个表(行为表,大概20+张,以下简称“子表”)与注册信息表(简称“主表”)进行关联,需要每天凌晨5点前输出预测数据。关联不同方式可能影响最终建模数据表生成时间。整理过程中,主要经过了如下步骤。
感想:
使用left outer join 进行关联时,left的表越多,则运算需要的时间越多。所以尽可能将需要left的表进行合并。使得left 的记录数变小。
第一天:
简单粗暴,将注册信息表直接与20+表关联,其实没有复杂的运算,但是任务执行时间2小时40分钟。
第二天:
1) 分析需要关联的表运行完成时间,发现其中很多行为表都是凌晨1点完成的。
2) 将同类特征且运行完成时间早的表进行先组合,然后再与注册信息表关联。
3)剔除完成时间较晚的子表
4)发现运行完成时间还是有些晚。
第三天:
1) 分析昨天处理后的子表,发现union all 结果,id去重与未去重差异挺大的,说明进将同类特征先合并不够,需要将更多的行为表合并(通过union all )减少记录数,然后再跟主表关联。
14114988 5433174
select
count(*)
,count(distinct id)
from (select
id
from t_a
where data_date=20170718
union all
select
id
from t_b
where data_date=20170718
)a
2) 分析大表(a,b), 发现这两个表的记录数都是超过千万级别的,但实际应用中,其实我们只需要使用最近活跃的用户。这两个表,
解决方法: 将主表拆分为当天活跃+历史活跃。历史活跃则可t+2计算,t+1计算时,则只需要计算当天活跃的。然后再 将历史活跃和当天活跃合并。