中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

結構化文本計算示例(一)

發布時間:2020-07-18 05:16:45 來源:網絡 閱讀:226 作者:raqsoft 欄目:大數據

結構化文本是很常見的文件格式,對結構化文本的計算也是很常見的需求。在實現這種計算時,一種很容易想到的辦法是將文件導入數據庫后再計算,但這會消耗大量時間以及昂貴的數據庫資源,而且有的場合下并沒有合適的數據庫可用。這樣一來,我們就會有一個自然的想法,如果能夠直接計算就會方便多了。可惜的是,一般高級語言都沒有提供針對結構化文本的基本運算類庫,而想要通過硬編碼完成這些運算又非常繁瑣,不僅代碼復雜,可維護性還很差。

作為專業的結構化數據計算類庫,集算器SPL封裝了豐富的結構化計算函數,支持集合運算、關聯運算、有序運算,因此可輕松實現結構化文本的運算。此外,SPL還可以通過JDBC調用接口向Java應用提供運算結果(可參考【Java 如何調用 SPL 腳本】),極大地方便集成工作。

下面我們就來看一下常見的結構化文本計算案例,以及SPL對應的解法。


維護

增加記錄

???????? 在sales.txt的第2行插入1條記錄。源文件如下:

OrderIDClientSellerIdAmountOrderDate
26TAS12142.42009-08-05
33DSGC1613.22009-08-14
84GC188.52009-10-16
133HU11419.82010-12-12
32JFS34682009-08-13
39NR330162010-08-21
43KT321692009-08-27

???????? 代碼


A
1=file("D:\\sales.txt").import@t()
2=A1.insert(2,200,"MS",20,2000,date("2015-02-02"))
3=file("D:\\sales.txt").export@t(A1)

?????????

結果????

OrderIDClientSellerIdAmountOrderDate
26TAS12142.42009-08-05
200MS2020002015-02-02
33DSGC1613.22009-08-14
84GC188.52009-10-16
133HU11419.82010-12-12
32JFS34682009-08-13
39NR330162010-08-21
43KT321692009-08-27

函數insert插入記錄,第1個參數是插入位置,當該參數為0時,表示追加記錄。

???????? 如果只是向文件追加記錄,那么不必讀入文件,只需用函數export@a,代碼如下:


A
1=create(OrderID,Client,SellerId,Amount,OrderDate).record([200,"MS",20,2000,date("2015-02-02")])
2=file("D:\\sales.txt").export@a(A1)

函數create新建二維表,函數record向二維表追加記錄。

另外,可以通過insert@r批量插入記錄,代碼如下:


A
1=file("D:\\sales.txt").import@t()
2=create(OrderID,Client,SellerId,Amount,OrderDate)
3

=A2.record([200,"MS",20,2000,date("2015-02-02"),

300,"Ora",30,3000,date("2015-03-03")])

4=A1.insert@r(2:A2)

???????? 為節省篇幅起見,下文都將省略導出文件的代碼。

刪除記錄

???????? 刪除sales.txt中的第2條記錄。代碼如下:


A
1=file("D:\\sales.txt").import@t()
2=A1.delete(2)

???????? 函數delete支持批量刪除,比如刪除第2,3,5,6,7條記錄:A1.delete([2,3]|to(5,7))

???????? 也可以按條件刪除,比如刪除Amount小于1000的記錄:A1.delete(A1.select(Amount<1000))

修改記錄

???????? 修改sales.txt的第2條記錄,將SellerId改為100,Amount改為1000,代碼如下:


A
1=file("D:\\sales.txt").import@t()
2=A1.modify(2,100:SellerId,1000:Amount)

???????? 也可以批量修改,比如將前10條記錄的Amount增加10:

???????? A1.modify(1:10,Amount+10:Amount)

增加列

???????? 在sales.txt增加列year,填入訂單日期OrerDate中的年份。代碼:


A
1=file("D:\\sales.txt").import@t()
2=A1.derive(year(OrderDate):year)

???????? 結果:

結構化文本計算示例(一)

刪除列

???????? 物理上刪除列效率較低,通常用“取出保留列”來代替。比如sales.txt中刪除Client、SellerId,相當于保留OrderID、Amount、OrderDate,代碼如下:


A
1=file("D:\\sales.txt").import@t()
2=A1.new(OrderID,Amount,OrderDate)

???????? 結果:

結構化文本計算示例(一)

修改列

???????? 將sales.txt的Amount列增加10%,代碼如下:


A
1=file("D:\\sales.txt").import@t()
2=A1.run(Amount*1.1:Amount)

結果:

結構化文本計算示例(一)

???????? 注意函數run跟函數modify的區別:修改整列(所有記錄的對應字段)需要用run,只修改指定記錄的某列(特定字段)用modify。

?

基本運算

查詢

???????? 指定時間段,按參數查詢sales.txt。代碼:


A
1=file("D:\\sales.txt").import@t()
2=A1.select(OrderDate>=startDate ? && OrderDate<=endDate)

???????? startDate和endDate是輸入參數,比如2010-01-01至2010-12-31。結果:

結構化文本計算示例(一)

排序

針對sales.txt,按照客戶代碼(Client)降序排序,按照訂單日期(OrderDate)升序排序。

代碼:


A
1=file("D:\\sales.txt").import@t()
2=A1.sort(-Client,OrderDate)

注意:降序時在字段前面使用英文的減號來表示,即“-”,默認按照升序。

結果:

結構化文本計算示例(一)

分組匯總

計算出每個銷售員每年的銷售額和訂單數,即按照銷售員分組,對銷售額求和,對記錄計數。

代碼:


A
1=file("D:\\sales.txt").import@t()
2=A1.groups(SellerId,year(OrderDate);sum(Amount),count(~))

函數groups可在分組的同時進行匯總,其中,~表示每組或當前組,count(~)等于count(OrderID)。

結果:

結構化文本計算示例(一)

獲得唯一值

列出sales.txt中的客戶名單,即獲取所有Client的唯一值。

代碼:


A
1=file("D:\\sales.txt").import@t()
2=A1.id(Client)

結果:

結構化文本計算示例(一)

去除重復

保留sales.txt中每個客戶每個銷售員的第一條記錄。獲取唯一值也是一種去重,這里是另外一種通過分組來去除重復的方式。

代碼:


A
1=file("D:\\sales.txt").import@t()
2=A1.group@1(Client,SellerId)

通過函數group進行分組(和groups不同,這里可以不匯總),@1表示取每組第1條記錄。

結果:

結構化文本計算示例(一)

?

TopN

???????? 找到每個銷售員銷售額最大的3筆訂單。

代碼:


A
1=file("D:\\sales.txt").import@t()
2=A1.group(SellerId;~.top(3;-Amount):t).conj(t)

函數top過濾出TopN,”-”表示逆序,函數conj用于合并結果。

計算結果:

結構化文本計算示例(一)

如果只取最大的一筆訂單,還可以用maxp函數,不過 maxp直接返回表達式描述的最大記錄,因此不用再加符號”-”來描述排序方式。由于分組后的字段t的內容是記錄,因此不能用conj(t)來合并,而是需要使用A.(t)方式直接取出t字段。所以取每個銷售的最大一筆訂單表達式為:=A1.group(SellerId;~.maxp(Amount):t).(t)


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

无棣县| 乐平市| 吉安县| 衡山县| 德钦县| 娄底市| 宁都县| 徐水县| 泾阳县| 南昌县| 开江县| 怀远县| 皋兰县| 株洲县| 疏勒县| 吉林省| 蒙自县| 大宁县| 天等县| 莫力| 淳安县| 开平市| 泽普县| 布尔津县| 宁津县| 来凤县| 沅陵县| 五指山市| 南宫市| 连云港市| 锡林郭勒盟| 栾城县| 错那县| 广昌县| 颍上县| 黔南| 上高县| 新竹县| 上饶县| 文安县| 德保县|