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;
就是判断若三个文件任意一个不存在就不执行合并表的操作。
一、需求:有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;
就是判断若三个文件任意一个不存在就不执行合并表的操作。
相关文章推荐
- 康诺云推出三款智能硬件产品,为健康管理业务搭建数据池
- MySQL中使用innobackupex、xtrabackup进行大数据的备份和还原教程
- SQL Report Builder 报表里面的常见问题分析
- 图文介绍报表与企业微信公众号集成方案
- 在ASP.NET 2.0中操作数据之三十四:基于DataList和Repeater跨页面的主/从报表
- php+ajax导入大数据时产生的问题处理
- C# 大数据导出word的假死报错的处理方法
- Java FineReport报表工具导出EXCEL的四种方式
- 用Python实现协同过滤的教程
- Python利用多进程将大量数据放入有限内存的教程
- mongodb常遇到的错误。
- 整理硬盘发现几个以前做的视频,分享下
- Stack数据结构的特点后进先出的应用:大数据运算
- Spark机器学习(一) -- Machine Learning Library (MLlib)
- Spark机器学习(二) 局部向量 Local-- Data Types - MLlib
- Spark机器学习(三) Labeled point-- Data Types
- 报表开发工具
- YARN或将成为Hadoop新发力点
- Hadoop 1.x版本伪单机配置
- 报表开发小技巧:报表的设计与配色技巧