数据按时间拆开分批处理示例

我现在的问题是有一个大的事实表,已经有数十亿条数据,过来的临时表需要merge进去. 临时表的大小也不确定,可能上十亿也可能只有几百几千万而已.

如果直接让这两个表merge起来,则需要很大的内存来进行处理.所以我就想着把数据进行按时间拆分的处理,然后merge进去,

拆分的条件是如果临时表的数据量大于三亿条,我就按二亿条左右一个批次进行merge.

总体设计完的package是这样的:

   

1.第一步,获取总的行数,然后分支下去进行判断.d大于三亿则拆分,否则只执行一次.

2.第二步,获取拆分的数据信息,生成开始时间与结束时间列表.因为我访问的数据库是vertica,语法与tsql略有差异.

我的示例vsql如下:

select

min(yearmonthday)::varchar as startdate,

timestampadd(day,1,max(yearmonthday))::varchar as enddate

FROM

(

select

sum(count(*)) over(order by run_strt_ts::timestamp::char(10)) as totalcount,

floor(sum(count(*)) over(order by run_strt_ts::timestamp::char(10))/200000000) as lvl,

run_strt_ts::timestamp::char(10)::timestamp as yearmonthday

from schemaname.tablename

group by run_strt_ts::timestamp::char(10)

) AS A

group by lvl order by lvl

生成类似的结果集:

这一步我使用了一个Execute sql task对象,配置为返回Full Result Set,传递一个object类型的变量接收.

刚开始我的设计不是这样的,我使用dataflowtask,然后里面一个ado.net source 去获取数据,传递给一个记录集destination.但总是报如下的异常:

所以我就改用现在的设计.

3.第三步就是使用一个Foreach look container,传递两个变量去接收返回的startdateenddate.

接着就简单了,装配tsql,传递 给一个Execute sql task 任务.

posted on 2014-04-23 16:43  tneduts  阅读(589)  评论(0编辑  收藏  举报

导航