您的位置:首页 > 大数据

QlikView 笔记(四) 关于时间控制数据的抽取计划

2016-07-12 13:34 309 查看
现在的项目里有几个需求是关于用时间控制数据的抽取计划的,以后相关的内容也会加到这个帖子内。

、需求:有A、B、C三个数据源,要求在周四抽取A、B的数据,周三抽取C的数据,ABC三个数据源的抽取过程都在一个generatorQVD文件中执行。task定义为每天都自动刷新一次。

实现:假设有几个tab,tab1为其他相关数据,tab2为A的抽取,tab3为B的抽取,tab4为C的抽取,tab5为将ABC的数据加载到同一个内存表并保存QVD。

需要用到if..then..elseif..then..endif.和weekday(). weekday()返回0~6(MON~SUN)对应周一到周日。

在tab2的前面定义变量获取当前的weekday,用if判断若当前为周四(weekda()=3),则抽取AB的数据。

LET vWeekDay=num(WEEKDAY(UTC()));

if $(vWeekDay)=3 then

后面就是抽取A的数据,

最后加一个store tableA into TableA.qvd(QVD);

Drop table tableA;

然后tab3不变

最后加一个store tableB into TableB.qvd(QVD);

Drop table tableB;

到tab4里最前面

elseif $(vWeekDay)=2 then

后面是抽取C的数据,

最后加一个store tableC into TableC.qvd(QVD);

Drop table tableC;

在tab5的最前面加endif   这时整个if判断结束,tab5里整合ABC的表直接从QVD文件加载数据即可。回顾一下就是判断若今天为周四则抽取AB的数据,若今天为周三则抽取C的数据,最后都存成了QVD文件,然后结束判断,最终表里直接从三个QVD文件加载数据。若今天为周三,则AB的文件仍然是上周四时保存的,tab2,3的内容不会执行,tab5里的总表也不会报错。其他同理。

、需求:同样是ABC三个数据源,要求是在UTC时间的5PM抽取BC的数据,UTC时间为10PM时抽取A的数据,并最终ABC整合成一个最终表。

实现:当然是可以做成两个generatorQVD文件,分别做task,在不同的时间抽取数据,但是为了保证脚本的一致性和不修改原来的脚本,我打算在原generator文件中加上if判断,然后给这个文件制定两个task刷新时间。

假设有几个tab,tab1为其他相关数据,tab2为A的抽取,tab3为B的抽取,tab4为C的抽取,tab5为将ABC的数据加载到同一个内存表并保存QVD。

需要用到InDayToTime()函数,函数有四个参数,第四个参数可忽略,第一个参数是入参,第二个参数为截止时间,第三个参数为整数,可以理解为偏移量,给二参的时间+n天或-n天,第四个参数为起始时间。



首先在tab2的前面加上

let vTimeTest1=InDayToTime(UTC(),today()&' '&MakeTime(23,0,0),0,today()&' '&MakeTime(21,0,0));

if $(vTimeTest1)=-1 then

后面是抽取A的数据,表示如果当前时间为9pm~11pm之间则执行A部分。然后保存QVD, endif。

在tab3前面

let vTimeTest2=InDayToTime(UTC(),today()&' '&MakeTime(16,0,0),0,today()&' '&MakeTime(18,0,0));

if $(vTimeTest2)=-1 then

后面是抽取BC的数据,表示如果当前时间为4pm~6pm之间则执行BC部分。然后保存QVD, endif。

最后在Tab5里从三个QVD文件中抽取数据到总表里。

然后task的计划为,每天的UTC时间5pm执行一次,10pm执行一次。

、不算需求,只是一个新的方法,因为也跟时间控制有关就记录一下。

sleep   ---可以让脚本等待一段时间再执行(后面跟正整数,单位为毫秒,最大为3600000)。

例:sleep 60000;  意思为等待60000毫秒/60秒/1分钟.  

如果想等待大于一小时,可以写多个sleep即可。

//-----------------更新:2016-7-14------------------

需求一,若按照上面的做法,第一周时会报错,因为文件不存在,这时可以在最后的总表合并前面加一个判断:
let vIfQVDExist=len(QvdCreateTime('file1.qvd'))*len(QvdCreateTime('file2.qvd'))*len(QvdCreateTime('file3.qvd'));

EXIT Script when $(vIfQVDExist)=0;

就是判断若三个文件任意一个不存在就不执行合并表的操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息