Aerospike C用戶端手冊———彙總—記錄彙總,aerospike用戶端

來源:互聯網
上載者:User

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  

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.