使用 lua 和 aerospike aql 获取值列表
Getting a list of values using lua and 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 中 return 得到如下结果:
AGGREGATE test.someFunction() ON test.set
+------+--------------+------+
| YEAR | DAY_OF_MONTH | SUMA |
+------+--------------+------+
| 2017 | 2 | 21 |
| 2017 | 3 | 25 |
+------+--------------+------+
如果你只做一个映射器 stream UDF 你可以 return 多行,但你想按天对计数进行分组,这样最终将是一个结果。
请注意,return 值只能是受支持的数据类型 - 字符串、blob、整数、双精度、列表、映射(当前)。您不能 return 记录,它不会完全按照您的建议显示在 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}}') |
+-----------------------------------+
我在 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 中 return 得到如下结果:
AGGREGATE test.someFunction() ON test.set
+------+--------------+------+
| YEAR | DAY_OF_MONTH | SUMA |
+------+--------------+------+
| 2017 | 2 | 21 |
| 2017 | 3 | 25 |
+------+--------------+------+
如果你只做一个映射器 stream UDF 你可以 return 多行,但你想按天对计数进行分组,这样最终将是一个结果。
请注意,return 值只能是受支持的数据类型 - 字符串、blob、整数、双精度、列表、映射(当前)。您不能 return 记录,它不会完全按照您的建议显示在 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}}') |
+-----------------------------------+