Aerospike C客戶端手冊———數據掃描—記錄變更

記錄變更

Aerospike提供能力來掃描數據庫中的記錄並通過用戶定義函數(UDF)變更每條記錄數據。

在SQL中,不帶條件變更表中所有記錄的UPDATE語句是:

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

Aeropike提供與上面SQL類似的功能,允許應用一個函數到每條記錄,通過函數來變更記錄數據。這個函數,被稱作UDF(用戶定義函數),被應用到單條記錄。它可以提供參數,能讀取和寫入記錄bin值與執行計算。

目前,掃描並應用UDF到每條記錄只能在後臺執行,就是說客戶端把掃描請求發給數據庫,但不用等待結果。掃描請求被放入隊列,並且數據庫中執行,沒有結果返回到客戶端。客戶端會得到一個id,用來標識所發送掃描請求對應的任務,可用這個id檢查掃描的狀態。

定義掃描

除了能定義一個應用到每條記錄的UDF,用於變更記錄內容的掃描定義與正常的掃描定義相同,並且是使用後臺掃描操作:aerospike_scan_background()。

我們象在【記錄掃描】章節中所做的類似,先構建一個掃描對象,但不需要去選擇bin,而且增加一個as_scan_apply_each()操作:

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“
  • 第4行 —  增加一個用戶定義函數(UDF),此函數被應用到每條掃描到的記錄。UDF函數mytransform()定義於模塊mymodule。在此例中,UDF不需要任何參數。

Defining the Record UDF 定義記錄UDF

The following is the mytransform" Record UDF, defined inmymodule`. It is a pretty simple Record UDF, mimicking the SQL statement above.

下面所示是定義於模塊mymodule中的UDF,名稱是mytransform,它相當簡單,模仿上述SQL語句的行爲。

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

A more elaborate function might be to increment "a", calculate "b" based on "a", and calculate "c" based on the values of "a" and "b":

稍微複雜點兒的函數可增加"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

執行掃描

此掃描可使用areospike_scan_background()執行:

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用來查詢掃描的狀態。scand_id爲0是未定義,所以掃描操作將生成並設置scan_id的值。

檢查掃描的狀態

可使用aerospike_scan_info()查詢掃描的狀態,狀態信息將填充到一個as_scan_info對象中。

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);
}

譯   者:歪脖大肚子Q
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章