Redis时间序列,LUA实现滚动总和

我有一个时间序列,我想要计算一个滚动总和。我的想法(可能已经不够优化)是编写一个脚本来计算每个数据点,然后在Python中运行一个管道。

我困惑于脚本。

返回
redis.call('TS.ADD',
           KEYS[1],
            ARGV[1],
            redis.call('TS.RANGE',
                       'ts:1s',
                        ARGV[2],
                        ARGV[3],
                        'AGGREGATION',
                        'sum',
                        120000)[1][2])

当我在redis-cli中使用args 1 ts:rolling:sum 1609011855000 1609013655000 EVAL时,它返回: (错误)ERR运行脚本时出错(调用f_e57a3287fc55b792d33ba7c21e3aae715c5ee3e5):@user_script:1: @user_script: 1:Lua redis()命令参数必须是字符串或整数

第一个调用

evalreturn redis.call( 'TS.RANGE''ts:1s',
             ARGV [2],
             ARGV [3],
             'AGGREGATION''sum',
             120000)“ 0 1609011855000 1609013655000

给了我

1)1)(整数)1609012800000
   2)2057

奇怪的是,我可以加上时间戳但是不能加上值。

我以前从未接触过LUA,所以我可能在这里漏了完全明显的东西

我不确定我清楚表达了什么,所以这里在Python中,使用pandas,我想要实现的是:

import pandas as pd
df = pd.DataFrame(my_data_granular_to_1s, columns=['date','val']).set_index(date)
df.val.resample('1s').sum().rolling(120).sum() # <= that
点赞
用户10574390
用户10574390

结果是

1) 1) (integer) 1609012800000
   2) 2057

通过v[1][2]["ok"]可以在lua中访问2057。

从我的“今天第一次接触lua”的角度来看,这看起来很像一个bug。在向团队报告问题之前,我将更加熟悉它,以确保我没有错过任何显而易见的问题。

2020-12-31 17:41:24
用户17696778
用户17696778

为什么

可以通过 v[1][2]["ok"]在lua中访问2057。

如果你使用内置的调试器,这非常清楚。

以下是一个示例:

- test.lua

redis.pcall("TS.ADD", KEYS[1], "*", 1, "ON_DUPLICATE", "SUM")

local reply = redis.call("TS.RANGE", KEYS[1], "-", "+")
redis.debug(reply)

redis.debug(reply[1][2]["ok"])
redis-cli -h your-host -p your-port --ldb --eval ./test.lua test:key
-> 2   redis.pcall("TS.ADD", KEYS[1], "*", 1, "ON_DUPLICATE", "SUM")
lua debugger> s
<redis> TS.ADD test:key * 1 ON_DUPLICATE SUM
<reply> 1655798188752
* Stopped at 4, stop reason = step over
-> 4   local reply = redis.call("TS.RANGE", KEYS[1], "-", "+")
lua debugger> s
<redis> TS.RANGE test:key - +
<reply> [[1655798188752,"+1"]]
* Stopped at 5, stop reason = step over
-> 5   redis.debug(reply)
lua debugger> s
<debug> line 5: {{1.6558e+12; {["ok"]="1"}}}
* Stopped at 8, stop reason = step over
-> 8   redis.debug(reply[1][2]["ok"])
lua debugger> s
<debug> line 8: "1"
* Stopped at 9, stop reason = step over
-> 9   <out of range source code line>
lua debugger> s

(nil)

(Lua debugging session ended -- dataset changes rolled back)

正如你所看到的,TS.RANGE返回一个嵌套表:

{{1.6558e+12; {["ok"]="1"}}}

所以我要使用以下代码来获得它的结果:

reply[1][2]["ok"]
2022-06-21 08:00:03