我正在尝试使用 UDF 创建聚合(map | reduce),但一开始就有问题。在 Aerospike 中,我有一个带有 bin 'u' (二级索引)和 bin 'v' 的集合,它是一个对象列表(带有交易列表和其他拍卖数据的拍卖),我有一个流 UDF 来聚合 'v' 的内部结构:
function trans_sum_by_years(s)
local function transform(rec)
local l = map()
local x = map()
local trans, auctions = 0, 0
for i in list.iterator(rec['v'] or list()) do
auctions = auctions + 1
for t in list.iterator(i['t'] or list()) do
trans = trans + 1
date = os.date("*t", t['ts'])
if l[date['year']] ~= nil then
l[date['year']] = l[date['year']] + t['price'] * t['qty']
else
l[date['year']] = t['price'] * t['qty']
end
end
end
x.auctions = auctions
x.trans = trans
x.v = l
return x
end
return s : map(transform)
end
问题是输出非常不同,具体取决于在表或 json 上设置输出。在第一种情况下,似乎一切正常:
{"trans":594, "auctions":15, "v":{2010:1131030}}
{"trans":468, "auctions":68, "v":{2011:1472976, 2012:5188}}
......
第二次我从内部记录聚合中得到空对象。{“trans_sum_b ...”:{“trans”:389,“拍卖”:89,“v”:{}}},{“trans_sum_b ...”:{“trans”:542,“拍卖”:30 , "v": {} } } .....
我更喜欢 json 输出并浪费了几个小时来找出为什么我得到空的 'v' 字段而没有成功。所以我的问题是“到底发生了什么”;-) 如果我的代码是正确的,那么 json 输出有什么问题,我看不到结果。如果我的代码错了,为什么错了,为什么表格输出结果符合我的需要。