資料蔣堂 常規遍歷語法

2021-09-23 00:00:52 字數 2885 閱讀 9412

遍歷可以說是最基本的集合運算了,比如求和、計數、尋找最大最小值等聚合運算,按條件過濾集合、根據集合成員生成另乙個新集合,也都是遍歷運算。集合化語法要求我們能用很短的語句(經常就只有一句,而不是若干語句構成的一段程式)來描述大部分遍歷運算,這樣我們需要考查遍歷運算中可能出現的各種常見情況,並設計出合理自治的語法規則。

我們從簡單到複雜來考查遍歷運算中的可能情況,並討論sql語法在這方面的表現。

比如計算集合成員的合計。

這是最簡單的情況,採用普通的函式語法風格就可以,將待遍歷的集合作為引數獲得返回值,比如sum(a)用於計算整合a成員的合計,當然也可以使用物件式的語法風格寫成a.sum()。

比如我們不是要計算集合成員的合計,而是要計算平方和,那麼這個平方該如何描述?

這就會用到我們在談集合化語法時提到的lambda語法。平方這個運算本質上是乙個函式,在遍歷過程中它以被遍歷集合的當前成員作為引數,返回該引數的平方。而lambda語法允許將這個函式以表示式的形式並一起寫入整個計算遍歷表示式,乙個語句就可以完成。但這裡就有乙個問題,我們在這個lambda表示式中用什麼識別符號或符號表示這個當前成員呢?

顯然,像普通函式那個先定義引數名不是個好辦法,那會讓lamdba表示式寫得很臃腫,失去lambda語法的簡潔性。儘管有些程式語言確實是這麼做的,不過我們並不提倡。使用乙個固定的識別符號也不好,太長了用起來不方便,太短又很可能與其它區域性變數重名導致歧義。我們提倡在這裡使用乙個特殊符號來完成這個目的。

比如使用~表示當前成員時,平方和就可以寫成a.sum(~~),簡單易懂。也可以分兩步做,先計算出集合成員的平方構成乙個新集合,再計算新集合的合計,寫成類似a.(~~).sum()的形式,後一步不再需要~寫法,前一步仍需要~寫法來描述平方這個表示式函式。

但是,我們發現,被認為是集合化語言的sql中並沒有使用某個符號或識別符號來表示當前遍歷成員,那麼sql又是怎麼解決上一部分的第二個問題的呢?

事實上,sql並沒有普通意義上可由任何成員構成的集合。sql的集合就是表,而表的成員都是相同結構的記錄。sql體系中有記錄這個概念,但並不能把記錄作為一種資料型別來引用。如果我們要在sql中針對乙個單值成員的集合進行遍歷,也只能把單值做成只有乙個欄位的記錄,而針對這些記錄構成的表進行遍歷。所有計算都是針對某些字段進行的,而不能針對整條記錄。

但這和sql沒有表示當前成員的符號有什麼關係呢?

我們在前面說集合化語法時還提到,面向結構化資料計算的集合化語法需要有簡潔的方式引用字段,sql提供了可以直接引用欄位的便捷機制,而sql又只能計算字段,那就可以不必再提供引用當前成員(記錄)的手段了。比如sql中計算平方和一定是某個欄位的平方和,而整條記錄(集合成員)的平方則沒有意義。

sql犧牲了集合的表達能力而簡化了語法。對於能夠支援泛型成員構成集合的語言來講,~寫法就是必要的了。而且,如果用於結構化資料計算時,sql這種可以直接欄位的寫法也要得到支援才會方便,計算某銷售帳目的金額時寫成"~.單價~.數量"顯然不如寫成"單價數量「更為簡單直觀,好的程式語言應當借鑑sql這種風格。

遍歷在本質上就是乙個迴圈,而迴圈語句可能有多層,這樣遍歷也可能會有巢狀引用。比如計算a,b兩個集合的交集,簡單的演算法就是遍歷a的成員,看是不是在b集合**現過(也是遍歷),這就會涉及到兩層的遍歷。

這時候~寫法就會產生歧義了,~到底是指a集合還是b集合的當前成員,這需要在語法規則上做乙個明確的約定。

一般採用的是就近原則,即如果沒有指明~是哪個集合的,那預設認為是內層遍歷集合的,而外層遍歷集合的當前成員則需要顯式地指出其從屬於哪個集合。計算交集的表示式就可以寫成a.select(b.count(~==a.~)>0),其中的~預設表示b的當前成員,而另乙個要顯式地寫成a.~以示區分。

面向結構化資料計算時可以直接引用欄位名,這時也可能產生內外層的歧義,也可以適用於就近原則,sql就是這樣。當內外層表有相同欄位名時,則預設被認為是記憶體表的字段,引用外層表的同名字段時必須顯式地寫上表名;如果內外存表中沒有相同欄位名,則可以正確識別出來而不必書寫表名。

遍歷運算雖然很基本,但設計其語法時仍有一些注意事項。sql在這方面總體表現不錯,除了缺乏泛型成員的集合外,用於描述常規遍歷運算還是比較方便簡捷的。

清華大學計算機碩士,著有《非線性報表模型原理》等,2023年,中國首個國際奧林匹克數學競賽團體冠軍成員,個人金牌;2023年,創立潤幹公司;2023年,首次在潤幹報表中提出非線性報表模型,完美解決了中國式複雜報表製表難題,目前該模型已經成為報表行業的標準;2023年,經過7年開發,潤幹軟體發布不依賴關係代數模型的計算引擎——集算器,有效地提高了複雜結構化大資料計算的開發和運算效率;2023年,潤幹軟體被富比士中文**評為「2015富比士中國非上市潛力企業100強」;2023年,榮獲中國電子資訊產業發展研究院評選的「2023年中國軟體和資訊服務業十大領軍人物」;2023年, 自主創新研發新一代的資料倉儲、雲資料庫等產品即將面世。

《資料蔣堂》的作者蔣步星,從事資訊系統建設和資料處理長達20多年的時間。他豐富的工程經驗與深厚的理**底相互融合、創新思想與傳統觀念的相互碰撞,虛擬與現實的相互交織,產生出了一篇篇的瀝血之作。此**的內容涉及從資料呈現、採集到加工計算再到儲存以及挖掘等各個方面。大可觀資料世界之遠景、小可看技術疑難之細節。針對資料領域一些技術難點,站在研發人員的角度從淺入深,進行全方位、360度無死角深度剖析;對於一些業內觀點,站在技術人員角度闡述自己的思考和理解。蔣步星還會對大資料的發展,站在業內專家角度給予**和推斷。靜下心來認真研讀你會發現,《資料蔣堂》的文章,有的會讓使用者避免重複前人走過的彎路,有的會讓攻城獅面對扎心的難題茅塞頓開,有的會為初入行業的讀者提供一把開啟資料世界的鑰匙,有的甚至會讓業內專家大跌眼鏡,產生思想交鋒。

第 21 期 常規遍歷語法

遍歷可以說是最基本的集合運算了,比如求和 計數 尋找最大最小值等聚合運算,按條件過濾集合 根據集合成員生成另乙個新集合,也都是遍歷運算。集合化語法要求我們能用很短的語句 經常就只有一句,而不是若干語句構成的一段程式 來描述大部分遍歷運算,這樣我們需要考查遍歷運算中可能出現的各種常見情況,並設計出合理...

資料蔣堂 JOIN提速 外來鍵指標化

我們來看重新定義join後如何能夠提高運算效能,先看外來鍵式join的情況。設有兩個表 其中sales表中的productid是指向products表中id欄位的外來鍵,id是products表的主鍵。現在我們想計算銷售額有多少 為簡化討論,就不再設定條件了 用sql寫出來 select sum s...

資料蔣堂 人工智慧中的「人工」

自從alphago贏了之後,人工智慧就變得非常熱門了。不過,大家在關注 智慧型 時,卻很少把注意力放在 人工 上,似乎感覺上了人工智慧之後,一切都能自動化了。其實,這份智慧型的背後有著大量的 人工 還有相當多不能自動化的事情。這裡的 人工 主要體現在兩個方面 1.資料準備 現代的人工智慧技術,或者說...