Aerospike C用戶端手冊———彙總—記錄彙總,aerospike用戶端
記錄彙總
有各種形式來處理次索引查詢結果。一個常用的形式就是彙總,就是在整個查詢結果集上應用一個函數。
許多開發人員都熟知如何在資料庫中使用SQL定義彙總查詢。
例如,下面是一條從資料庫中統計記錄行數的SQL語句:
SELECT count(*)FROM test.demo WHERE d = 50
這條語句統計"test.demo"表中列"d"的值等於50的記錄個數。
在Aerospike中,通過使用查詢與使用者定義函數來完成這個任務。
請先閱讀:
- 【建立串連】章節,理解如何建立與叢集的串連。
- 【次索引管理】章節,理解如何新建立次索引。
- 【查詢】章節,理解如何使用C用戶端實現查詢。
定義查詢
使用Aerospike C用戶端API實現SQL語句相同的功能,可構建如下查詢:
as_query query;as_query_init(&query, "test", "demoset");as_query_where_inita(&query, 1);as_query_where(&query, "d", integer_equals(50));as_query_apply(&query, "mymodule", "mycount", NULL);
上面的查詢對象,被尋找資料所在的namespace名稱為“test”、set名稱為“demoset”,在其中尋找bin名是"d"且整型值等於50的記錄。一個名字叫做”mycount()“的streamUDF將應用在查詢結果集上,此streamUDF可在模組mymodule中找到。
注意:不帶“where"語句的查詢會導致全庫掃描。
定義Stream UDF
Stream UDF函數mycount()定義於模組mymodule,可以處理資料流。UDF mycont()定義是:
local function one(rec) return 1endlocal function add(a, b) return a + bendfunction mycount(stream) return stream : map(one) : reduce(add);end
函數mycount()是個Stream UDF,應用於流。在此案例中是查詢結果流。我們在流上增加要在查詢結果上執行的操作。在流上執行的操作是:
map
— 從流中將一個值映射到另一個值。在這個樣本中,映射被定義成函數one(),映射記錄到數值1。
reduce
— 從流中將多個值歸納成一個值。在這個樣本中,歸納是將流中的兩個值相加,.這些值就是來自映射函數的一堆數值1。
最終結果是一個包含單個值的流:count,或更技術化地講,是結果集中每條記錄對應的”1“的合計。
註冊UDF
在一個查詢能使用streamUDF之前,UDF函數必須註冊到Aerospike伺服器。
as_error err;// Register the UDF file in the database cluster.if (aerospike_udf_put(&as, &err, NULL, "mymodule", AS_UDF_TYPE_LUA, &udf_content) != AEROSPIKE_OK) { LOG("aerospike_udf_put() returned %d - %s", err.code, err.message);}
執行查詢
使用aerospike_query_foreach()執行查詢:
if (aerospike_query_foreach(&as, &err, NULL, &query, each_value, NULL) != AEROSPIKE_OK) { fprintf(stderr, "err(%d) %s at [%s:%d]\n", err.code, err.message, err.file, err.line);}
這將在資料庫中執行此查詢。
處理結果
對查詢返回的值逐個調用函數each_value()。函數的實現可能類似於:
bool each_value(const as_val *val, void *udata) { if (val == NULL) { // query is complete return true; } as_integer *ival = as_integer_fromval(val); if (ival == NULL) { // abort the query return false; } // process the value return true;}
上面的樣本中,返回1個整數,表明滿足查詢條件的記錄計數。??????原文如此。
若想在每次回調時傳遞一個全域對象出來,請在調用aerospike_query_foreach()時提供一個userdata類型的參數。
清理資源
一旦查詢結束,查詢對象與其成員對象可使用as_query_destroy()函數安全地釋放。注意在我們的樣本中,可以不用顯式調用as_query_destroy(),因為是從棧上分配的as_query對象,並且使用了as_query_where_inita(),來避免內部使用堆。
原文串連: http://www.aerospike.com/docs/client/c/usage/query/aggregate.html譯 者:歪脖大肚子Q