我试图用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输出有什么问题,我没有看到结果。如果我的代码错了,为什么它错了,为什么表输出会产生我需要的结果。
答案 0 :(得分:0)
@ user1875438您的代码是正确的。似乎aql中存在错误。
我的结果和你的一样,使用json模式时v的字段是空的。
我在运行这两个命令时使用public void sound(){
//store the sound file name
String filename=f_fruit_ar.m4a;
//All sounds stored in assets folder
try{
AssetFileDescriptor afd = getAssets().openFd(filename);
MediaPlayer player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
player.prepare();
player.start();
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
player.release();
}
});
}
catch (Exception e) {
e.printStackTrace();
}
}
来获取aerospike-server的响应,并发现响应是一样的,所以我认为很可能在aql工具中存在错误。
tcpdump
我刚发布了一个问题here。
答案 1 :(得分:0)
答案很简单。但我是Aerospike / Lua的新手,我不相信自己的知识,所以我在AQL / UDF区域内到处搜索错误。问题更为根本,并且干扰了JSON本身的规范。
JSON中的键必须是字符串!所以tostring(date['year'])
解决了问题。
其他问题是它是一个错误还是一个功能:-)如果Aerospike的地图类型允许整数键应该有从整数到字符串的自动密钥转换以满足JSON规范吗?恕我直言应该有,但可能有些人不同意声称地图类型不适用于整数键......