Lua AQL与流UDF的不同结果取决于输出样式(表,json)

Lua AQL与流UDF的不同结果取决于输出样式(表,json),lua,udf,aerospike,aql,Lua,Udf,Aerospike,Aql,我试图用UDF创建聚合(map | reduce),但一开始就出了问题。在Aerospike中,我有一个包含bin‘u’(二级索引)和bin‘v’的集合,bin‘v’是一个对象列表(带有交易列表和其他拍卖数据的拍卖),我有一个流UDF来聚合‘v’的内部结构: function trans_sum_by_years(s) local function transform(rec) local l = map() local x = map()

我试图用UDF创建聚合(map | reduce),但一开始就出了问题。在Aerospike中,我有一个包含bin‘u’(二级索引)和bin‘v’的集合,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输出有什么问题,我看不到结果。如果我的代码是错误的,为什么它是错误的,为什么表输出结果符合我的需要。

@user1875438您的代码是正确的。似乎aql中存在缺陷。
我的结果与您的结果相同,使用json模式时,v字段为空。 我在运行这两个命令时使用了
tcpdump
获取aerospike服务器的响应,发现响应是相同的,所以我认为aql工具中很可能存在错误

159   0x0050:  0001 0000 0027 0113 0007 5355 4343 4553  .....'....SUCCES
160   0x0060:  5383 a603 7472 616e 7301 a903 6175 6374  S...trans...auct
161   0x0070:  696f 6e73 01a2 0376 81cd 07ce 01         ions...v.....
162 01:57:38.255065 IP localhost.hbci > localhost.57731: Flags [P.], seq 98:128, ack 144, win 42853, options [nop,nop,TS val 976630236 ecr 976630223], length 30
163   0x0000:  4500 0052 55f8 4000 4006 0000 7f00 0001  E..RU.@.@.......

我刚刚发布了一个问题。

@user1875438您的代码是正确的。似乎aql中存在缺陷。
我的结果与您的结果相同,使用json模式时,v字段为空。 我在运行这两个命令时使用了
tcpdump
获取aerospike服务器的响应,发现响应是相同的,所以我认为aql工具中很可能存在错误

159   0x0050:  0001 0000 0027 0113 0007 5355 4343 4553  .....'....SUCCES
160   0x0060:  5383 a603 7472 616e 7301 a903 6175 6374  S...trans...auct
161   0x0070:  696f 6e73 01a2 0376 81cd 07ce 01         ions...v.....
162 01:57:38.255065 IP localhost.hbci > localhost.57731: Flags [P.], seq 98:128, ack 144, win 42853, options [nop,nop,TS val 976630236 ecr 976630223], length 30
163   0x0000:  4500 0052 55f8 4000 4006 0000 7f00 0001  E..RU.@.@.......

我刚刚发布了一个问题。

答案非常简单。但我是Aerospike/Lua的新手,我不相信自己的知识,所以我在AQL/UDF区域之外的任何地方都搜索错误。这个问题更为根本,干扰了JSON本身的规范

JSON中的键必须是字符串!所以
tostring(date['year'])
解决了这个问题


另一个问题是它是一个bug还是一个特性:-)如果Aerospike的映射类型允许整数键,那么是否应该有从整数到字符串的自动键转换来满足JSON规范?我想应该有,但可能有些人不同意说映射类型不适用于整数键…

答案非常简单。但我是Aerospike/Lua的新手,我不相信自己的知识,所以我在AQL/UDF区域之外的任何地方都搜索错误。这个问题更为根本,干扰了JSON本身的规范

JSON中的键必须是字符串!所以
tostring(date['year'])
解决了这个问题

另一个问题是它是一个bug还是一个特性:-)如果Aerospike的映射类型允许整数键,那么是否应该有从整数到字符串的自动键转换来满足JSON规范?我想应该有,但可能有些人不同意说映射类型不适用于整数键