使用lua和aerospike aql获取值列表

我有一个在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   |
    +------+--------------+------+
点赞
用户582436
用户582436

如果您正在执行仅 mapper 的 stream UDF,您可以返回多个行,但您想按天数分组计数,因此最终将显示一个单独的结果。

请注意,返回值只能是支持的数据类型 - string、blob、integer、double、list、map(目前)。您不能返回记录,并且它不会像您建议的那样在 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}}')  |
+-----------------------------------+
2017-04-06 08:29:45