数据按时间拆开分批处理示例
我現(xiàn)在的問題是有一個(gè)大的事實(shí)表,已經(jīng)有數(shù)十億條數(shù)據(jù),過來的臨時(shí)表需要merge進(jìn)去. 臨時(shí)表的大小也不確定,可能上十億也可能只有幾百幾千萬(wàn)而已.
如果直接讓這兩個(gè)表merge起來,則需要很大的內(nèi)存來進(jìn)行處理.所以我就想著把數(shù)據(jù)進(jìn)行按時(shí)間拆分的處理,然后merge進(jìn)去,
拆分的條件是如果臨時(shí)表的數(shù)據(jù)量大于三億條,我就按二億條左右一個(gè)批次進(jìn)行merge.
總體設(shè)計(jì)完的package是這樣的:
? ?
1.第一步,獲取總的行數(shù),然后分支下去進(jìn)行判斷.d大于三億則拆分,否則只執(zhí)行一次.
2.第二步,獲取拆分的數(shù)據(jù)信息,生成開始時(shí)間與結(jié)束時(shí)間列表.因?yàn)槲以L問的數(shù)據(jù)庫(kù)是vertica,語(yǔ)法與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
生成類似的結(jié)果集:
這一步我使用了一個(gè)Execute sql task對(duì)象,配置為返回Full Result Set,傳遞一個(gè)object類型的變量接收.
剛開始我的設(shè)計(jì)不是這樣的,我使用dataflowtask,然后里面一個(gè)ado.net source 去獲取數(shù)據(jù),傳遞給一個(gè)記錄集destination.但總是報(bào)如下的異常:
所以我就改用現(xiàn)在的設(shè)計(jì).
3.第三步就是使用一個(gè)Foreach look container,傳遞兩個(gè)變量去接收返回的startdate與enddate.
接著就簡(jiǎn)單了,裝配tsql,傳遞 給一個(gè)Execute sql task 任務(wù).
轉(zhuǎn)載于:https://www.cnblogs.com/huaxiaoyao/p/3683245.html
總結(jié)
以上是生活随笔為你收集整理的数据按时间拆开分批处理示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初步学习pg_control文件之八
- 下一篇: pdftk的使用介绍