【问题标题】:Getting a list of values using lua and aerospike aql使用 lua 和 aerospike aql 获取值列表
【发布时间】:2017-04-06 16:29:45
【问题描述】:

我在 aerospike 中有以下设置:

INSERT INTO test.set (PK,DAY_OF_MONTH,YEAR,value) VALUES (1,2,2017,10)
INSERT INTO test.set (PK,DAY_OF_MONTH,YEAR,value) VALUES (2,2,2017,11)
INSERT INTO test.set (PK,DAY_OF_MONTH,YEAR,value) VALUES (3,3,2017,12)
INSERT INTO test.set (PK,DAY_OF_MONTH,YEAR,value) VALUES (4,3,2017,13)

我是 aerospike 的新手,目前我只知道如何在 LUA 中检索单个值,但我想知道如何检索和创建一组值。

例如,我想知道如何在 aql 中返回如下结果:

    AGGREGATE test.someFunction() ON test.set

    +------+--------------+------+
    | YEAR | DAY_OF_MONTH | SUMA |
    +------+--------------+------+
    | 2017 | 2            | 21   | 
    | 2017 | 3            | 25   |
    +------+--------------+------+

【问题讨论】:

    标签: lua aerospike


    【解决方案1】:

    如果您正在执行仅映射器 stream UDF 您可以返回多行,但您希望按天对计数进行分组,这样最终将成为一个结果。

    请注意,返回值只能是支持的数据类型 - 字符串、blob、整数、双精度、列表、映射(当前)。您不能返回记录,并且它不会完全按照您的建议显示在 AQL 中。还要了解 AQL 是一种用于管理和数据浏览的工具。它不是您应该构建代码的客户端。这就是各种语言客户端的用途(Java、C#、Go、Node.js、Python 等)。

    这是一个示例,说明您将如何按照您的要求进行操作:

    local function reducer(map1, map2)
      return map.merge(map1, map2, function (id1,id2)
        return map.merge(id1, id2, function (val1,val2)
          return (val1 or 0) + (val2 or 0)
        end)
      end)
    end
    
    local function mapper(rec)
      return map{year=rec.YEAR, day=rec.DAY_OF_MONTH, val=rec.value}
    end
    
    local function sum_day(group, rec)
      local year = tostring(rec['year'])
      local day = tostring(rec['day'])
      if not group[year] then
        group[year] = map()
      end
      group[year][day] = (group[year][day] or 0) + rec['val']
      return group
    end
    
    local function check_rec(rec)
      if rec['YEAR'] and rec['DAY_OF_MONTH'] and
         rec['value'] and
         type(rec['value']) == 'number' then
        return true
      else
        return false
      end
    end
    
    function group_by_day(stream)
      return stream : filter(check_rec) :  map(mapper) : aggregate(map(), sum_day) : reduce(reducer)
    end
    

    现在来自 AQL:

    aql> aggregate aggr.group_by_day() on test.set
    +-----------------------------------+
    | group_by_day                      |
    +-----------------------------------+
    | MAP('{"2017":{"3":25, "2":21}}')  |
    +-----------------------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多