ODPS SDK呼叫排坑筆記 2

2021-09-19 18:43:22 字數 1315 閱讀 4574

一、業務背景

業務上需要通過對二級類目的聚合,輸出每個類目下排名30天銷量排名top100的商品資訊。抽象到sql層面就是:通過對x欄位的分組,獲取每個分組前n條資料。

二、原始方案

說實話,這個方法有些low,但起碼能實現功能。使用儲存過程,思路如下:

1.建立一張臨時表先放著:create temp_top_by_catename2

2.查詢所有的二級類目: select distict cate_level2_name from *** where ds=max_pt('***')

3.將cate_level2_name儲存在變數陣列中catename;

4.游標遍歷catename;select * from *** as a where a.cate_level2_name=catename order by sales_count_30 desc limit 100

將每個二級類目的查詢結果insert到temp_top_by_catename2表

方案缺點:

(1)時間成本太高,因為有多少個catename分組,就要查詢n次表,更改插入n次表。跑了30小時才插了<100個類目分組

(2)另外表基數量很大,每次查詢計畫的cost值很高。

(3)如果sql有中斷,資料的完整性很難保證

三、優化方案

基於上述方案的種種不爽,問自己乙個問題,能否一條語句可以解決group+order+topn輸出?於是開始了度娘之旅,但都是些巢狀+子查詢的方式曲線救國,並達不到想要的效果。在試,從odps的函式著手,翻了一遍返現只有乙個神奇api貌似像,名字給出:「row_num」.先普及下這個函式的定義:

語法:row_number() over (partition by 分組字段 order by 排序字段 desc ) as topnum

拆解:(1)partition by :按照某一字段進行分組

(2)order by:分組之後按照該欄位進行公升序或降序排列

(3)topnum:自定義的名字,就是後面我們要用到的topn,同步資料時可設定成變數,動態調整

四、原始碼

五、效能結果

自此 over,知識有限,大家如有更好的方案歡迎私聊。

填坑筆記 頁面Page Load呼叫2次的問題解決

很多時候寫 都會用到 if ispostback 來處理頁面載入後的初始化資料,這些資料往往都是頁面載入後就不需要再次用到。今天碰到了乙個很奇怪的問題,初始化資料每次頁面重新整理都會載入,後來終於發現原來是因為page load呼叫了2次,而且ispostback的值一次是true一次是false,...

演算法筆記2 排序

1.選擇排序 首先,找到陣列中最小的那個元素,其次,將他和陣列第乙個元素交換位置,再次,在剩下的元素中找到最小的元素,將他和陣列的第二個元素交換位置。如此反覆,直到將整個陣列排序。不斷的選擇剩餘元素的最小值 2.插入排序 對部分有序陣列很有效 為了給要插入的元素騰出空間,我們需要將其餘所有元素在插入...

c c 排坑 2 c語言中的符號過載

所謂的符號過載就是在不同的上下文環境裡有不同的意義。甚至有些關鍵字也被過載而具有好幾種意義,這也是c語言的作用域規則對程式設計師不那麼清晰的主要原因。本章內容摘自 c專家程式設計 p37。符號意義 static 在函式內部,表示該變數的值在各個呼叫間一直保持延續性 在函式這一級,表示該函式只對本文可...