轉換資料

串流表達式提供了一組強大的函式,用於轉換結果集。本使用者指南的此章節概述了應用於結果集的實用轉換。

選取和新增欄位

select 函式包裝另一個串流表達式,可以對串流中的每個元組執行以下操作

  • 選取欄位的子集

  • 將欄位對應到新的名稱

  • 計算新的欄位

以下範例顯示 select 函式包裝 search 函式,並將欄位對應到新的欄位名稱。recNum 函式是一個數學表達式,它只會傳回元組的目前記錄編號。select 表達式可以呼叫任何數學表達式來計算新的值。

select1

以下範例使用 div 函式從兩個現有欄位計算新的欄位

select math

篩選元組

having 函式可用於根據布林邏輯篩選串流中的元組。

在以下範例中,having 函式篩選 facet 函式的輸出,只發出 count(*) 大於 20404 的元組。

having

分頁

可以使用 recNum 函式加入的記錄編號,來篩選以支援分頁。

在以下範例中,使用巢狀 ltgt 函式的 and 函式,來選取特定記錄編號範圍內的記錄

search page

處理 Null 值

notNullisNull 函式可以用來將 null 值替換為不同的值,或篩選出具有 null 值的元組。

以下範例在 select 函式中使用 isNull 函式,將 null 值替換為 -1。if 函式採用 3 個參數。第一個是布林表達式,在此案例中為 isNull。如果布林函式傳回 true,if 函式會傳回第二個參數,如果傳回 false,則傳回第三個參數。在此案例中,isNull 永遠為 true,因為它正在檢查元組中未包含在結果集中的欄位。

select2

notNullisNull 也可以與 having 函式一起使用,以篩選出具有 null 值的元組。

以下範例會發出所有文件,因為它正在針對結果集中不存在的欄位評估 isNull,這會永遠傳回 true。

having2

以下範例會發出零個文件,因為它正在針對結果集中不存在的欄位評估 notNull,這會永遠傳回 false。

having3

正規表示式匹配與篩選

可以在 having 函式內使用 matches 函式,測試記錄中的欄位是否符合特定的正規表示式。這允許對搜尋結果進行複雜的正規表示式匹配。

以下範例使用 matches 函式來傳回 complaint_type_s 欄位以 Commercial 結尾的所有記錄。

search matches

排序

可以使用 sorttop 函式來重新排序記憶體中的結果集。sort 函式會根據排序條件排序並傳回整個結果集。可以使用 top 函式根據排序條件傳回結果集中前 N 個值。

search resort

Rollups

可以使用 rolluphashRollup 函式來對結果集執行彙總。這與 facetfacet2Dtimeseries 彙總函式不同,後者使用 JSON 分面 API 將彙總推送到搜尋引擎。

rollup 函數執行類似 map-reduce 風格的彙總操作,這需要結果串流依據分組欄位排序。這允許對高基數欄位進行彙總。hashRollup 函數執行彙總操作時,將所有桶保存在記憶體中的雜湊映射中。這需要足夠的記憶體來儲存所有不同的分組依據欄位,但不要求底層串流已排序。

下面的範例顯示從 nyc311 投訴資料庫的隨機樣本中,前 5 大投訴類型的視覺化呈現。top 函數用於根據 hashRollup 輸出的 count(*) 欄位,選取前 5 大投訴類型。

hashRollup