標籤:blog http 使用 檔案 資料 2014
問題背景:
一直非常想不通,公司花了N多錢請了一幫QlikView的Consultant做出來的solution居然沒有涉及Reload的部分,以至於每次重新整理資料都須要重新整理整個Data Model,之前和部門同事討論的時候我還信誓旦旦的說QlikView就僅僅能這樣了,找不到方法僅僅將新資料重新整理到Data Model中而不用又一次load之前已經在Memory裡面的資料。
幸而今天一位朋友提到了Add Load中的Partial Load,於是便查了一個小時的Google,經過回來實驗之後,豁然開朗了,後續再過一年半載,小哥我能夠又一次改寫公司的solution。哈哈,美夢到此為止,以下開始進入主題:
什麼是Partial Load:
顧名思義,Partial Load就是部分載入資料的意思,比方資料倉儲中維度資料表的資料來源有資料來要插入到資料庫中的時候,會用Merge來控制僅僅添加?或者更新資料,而對已經存在於資料庫中沒有不論什麼變化的資料不做處理。對QlikView,我們能夠想象一下,因為QlikView將資料匯入到記憶體中,那麼在又一次載入資料到記憶體中的時候,有沒有一種方法是對在記憶體中不變的資料不作處理,而僅僅用載入新的資料進去呢?今天我實驗的結果是肯定的,用以下的方法就能夠。
LET vTimeStart = Now();FOR vI = 1 to 1000LOAD$(vI) as SellerId,$(vI) as SalesFromTestAdd.csv;Next;TestAddTable:Add LOADSellerId,SalesFromTestAdd.csv(txt, codepage is 936, embedded labels, delimiter is ',', msq)Wherenot Exists(SellerId);LET vTimeEnd = Now();
注意:TestAdd.csv檔案要和QVW檔案放在一個檔案夾下,否則須要寫TestAdd.csv的全路徑。將上面的QlikView代碼複製到QlikView Script中去之後,點擊Reload;
因為For ... Next語句裡迴圈載入了1000條資料,TestAdd.csv檔案裡開始僅僅有以下一條資料:
SellerId, Sales10000123,987654321
因此資料載入完成之後,在Data Model裡面預覽TestAddTale裡的資料如為:。
然後再往TestAdd.csv檔案裡新添加?一條資料,TestAdd.csv中的資料變為:
SellerId,Sales10000123,98765432112332112,312677876
在報表中建立一個文字物件,公式為:=Second(vTimeEnd - vTimeStart),結果為5秒左右表示整個Reload用了5秒。
以下激動人心的時刻到了,點擊Partial Load(File - > Partial Reload),資料瞬間載入完成,頁面上的文字物件已經變為了0,表示這次資料載入所用的時間差點兒為0. 再Preview一下Data Model裡面的TestAddTable裡的資料為: 新資料已經載入進去,老資料依舊在記憶體中沒有變化。
因為加了Not Exists的過濾條件,因此第一條資料10000123,987654321,不會被再次載入到Data Model中。(我會在另外一篇文章中具體描寫敘述Exists的作用) 某則將出現兩條一模一樣的資料。
Partial Load在實際工作中的使用展望:
在我發現這個功能之後,被小夥伴們質疑在現實項目中是否實用武之地,我想了想,肯定是實用的,僅僅是受制於如今的solution,假以時日等小哥技術成熟了,肯定能寫出一套更好的solution。比方能夠這樣用:對於月更新的資料,就用一般的Load方式,對於每天要重新整理的檔案,就用Add Load的方式進行Partial Load,這樣就不會每次重新整理Daily檔案的時候也把Monthly的資料一起重新整理了。
結語,如今俺也是接觸QlikView不久。有言論不對之處,各位小夥伴多多不吝賜教。