Redis Timeseries, скользящая сумма с LUA

У меня есть временной ряд, для которого я хочу вычислить скользящую сумму. Моя идея (которая, вероятно, уже неоптимальна) состоит в том, чтобы иметь сценарий для вычисления каждой точки данных, а затем запускать ее из Python в конвейере.

Я борюсь со сценарием.

      return 
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 с аргументами 1 ts:rolling:sum 1609011855000 1609013655000

он возвращает: (error) ERR Error running script (call to f_e57a3287fc55b792d33ba7c21e3aae715c5ee3e5): @user_script:1: @user_script: 1: Lua redis() command arguments must be strings or integers

первый звонок

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

дает мне

      1) 1) (integer) 1609012800000
   2) 2057

Странно то, что я могу суммировать метки времени, но не значения.

Я никогда раньше не прикасался к lua, поэтому здесь я могу упустить что-то совершенно очевидное.

Я не уверен, что я понимаю, поэтому вот в питоне с пандами, чего я хотел бы достичь:

      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

2 ответа

Почему

2057 доступно в lua через v[1][2]["ok"]

вполне понятно, если вы используете встроенный отладчик .

Вот пример:

      -- 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"]

оказывается

      1) 1) (integer) 1609012800000
   2) 2057

2057 доступно в lua через v[1][2]["ok"]

С моей точки зрения «Я только сегодня впервые прикоснулся к lua», это очень похоже на ошибку. Я ознакомлюсь немного больше, чтобы убедиться, что не пропущу что-то очевидное, прежде чем открывать вопрос на github, чтобы сообщить команде.

Другие вопросы по тегам