Обновление ячеек в секционированной таблице с помощью .Q.ind [] в q - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть секционированная таблица, и я могу прочитать ее, используя команду get следующим образом: get `: hdb / 2018.01.01 / trade

и выдаст мне:

sym size exchange
-----------------
0   100  2
1   200  2
1   300  2

Iнапример, изменить значение ячейки, например, размер от 200 и 300 до 1000, учитывая индекс или список строк.Поэтому я использую

.Q.ind[`:hdb/2018.01.01/trade; 1 2j]

, чтобы получить строки, а затем изменить ячейку.Но я получаю ошибку ранга при запуске .Q.ind [].

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы также можете использовать операцию исправления для обновления значений.

@[`:hdb/2018.01.01/trade;`size;@[;1 2;:;1000]

Это отредактирует вашу таблицу на диске.

q)get`:hdb/2018.01.01/trade
sym size exchange
-----------------
0   100  2
1   200  2
1   300  2

q)@[`:hdb/2018.01.01/trade;`size;@[;1 2;:;1000]]
`:hdb/2018.01.01/trade
q)get `:hdb/2018.01.01/trade/
sym size exchange
-----------------
0   100  2
1   1000 2
2   1000 2
0 голосов
/ 07 февраля 2019

Ошибка, которую вы получаете, заключается в том, что первым входным параметром для .Q.ind является имя сопоставленной таблицы, а не символ, представляющий имя / местоположение таблицы

Я не уверен, если .Q.Здесь вам поможет ind, он более полезен для извлечения данных, чем для перезаписи.

Можно использовать несколько подходов:

  1. Извлечь весь срез даты select from table where date=X, изменить его в памяти и записать обратно, используя `:hdb/2018.01.01/trade/ set delete date from modifiedTable.Предполагается, что вы не изменяете никакие перечисляемые / символьные столбцы.Вы должны быть осторожны, чтобы поддерживать ту же схему, поддерживать то же сжатие и т. Д.
  2. Используйте пакет dbmaint для обработки изменений: https://github.com/KxSystems/kdb/blob/master/utils/dbmaint.md
  3. Если вы достаточно осторожны, вы можете получитьтолько сам столбец, измените его и запишите обратно.p set @[get p:`:hdb/2018.01.01/trade/col1;1 2;:;1000]
...