首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

Aerospike 掃描操作:使用 UDF 進行記錄轉換

     編輯:DB2 教學

Aerospike 掃描操作:使用 UDF 進行記錄轉換

記錄變更掃描簡介

Aerospike 提供掃描資料庫中所有記錄,並透過使用者定義函數(UDF)逐筆轉換記錄資料的能力。這類似於 SQL 中無條件的 UPDATE 敘述:

UPDATE test.demo SET a = 1, b = 2, c = 3

Aerospike 允許應用程式定義一個 UDF 套用至每一筆掃描到的記錄。UDF 可接收參數、讀寫 Bin 值並執行計算。目前掃描並套用 UDF 僅支援背景執行模式:客戶端發送請求後不等待結果,掃描任務排入佇列由伺服器端執行,不回傳結果給客戶端。客戶端獲得一個 scan_id 以追蹤任務狀態。

定義掃描任務

除了指定套用至每筆記錄的 UDF,轉換掃描的定義與一般掃描相同,使用背景掃描操作 aerospike_scan_background()。建立掃描物件後,透過 as_scan_apply_each() 加入 UDF:

as_scan scan;
as_scan_init(&scan, "test", "demo");
as_scan_apply_each(&scan, "mymodule", "mytransform", NULL);

說明:

  1. 在堆疊上建立 as_scan 物件。
  2. 初始化掃描,指定 namespace 為 "test"、set 為 "demo"。
  3. 加入 UDF:模組 mymodule 中的 mytransform() 函數,套用至每筆掃描記錄。本例無參數。

定義記錄 UDF (Lua)

以下為定義於 mymodule 中的 mytransform UDF,模仿上述 SQL 行為:

function mytransform(rec)
    rec['a'] = 1
    rec['b'] = 2
    rec['c'] = 3
    aerospike:update(rec)
end

進階範例:遞增 a、依 a 計算 b、依 a 與 b 計算 c:

function mytransform(rec)
    rec['a'] = rec['a'] + 1
    rec['b'] = rec['a'] * 2
    rec['c'] = rec['a'] + rec['b']
    aerospike:update(rec)
end

執行背景掃描

uint64_t scan_id = 0;
if (aerospike_scan_background(&as, &err, NULL, &scan, &scan_id) != AEROSPIKE_OK) {
    fprintf(stderr, "error(%d) %s at [%s:%d]\n", err.code, err.message, err.file, err.line);
}

scan_id 初始為 0 表示未定義,掃描操作會產生並設定該值。此 ID 用於後續查詢掃描狀態。

查詢掃描狀態

as_scan_info scan_info;
if (aerospike_scan_info(&as, &err, NULL, scan_id, &scan_info) != AEROSPIKE_OK) {
    fprintf(stderr, "error(%d) %s at [%s:%d]\n", err.code, err.message, err.file, err.line);
}

狀態資訊填入 as_scan_info 物件,包含進度百分比等欄位,應用程式可據此估算剩餘時間並決定輪詢頻率。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved