KDB: почему я получаю ошибку при загрузке? - PullRequest
0 голосов
/ 22 ноября 2018

Я указал столбцы типа String.Почему я получаю следующую ошибку:

q)test: ([key1:"s"$()] col1:"s"$();col2:"s"$();col3:"s"$())
q)`test upsert(`key1`col1`col2`col3)!(string "999"; string "693"; string "943"; 
string "249")

'type
[0]  `test upsert(`key1`col1`col2`col3)!(string "999"; string "693"; string "9
43"; string "249")

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Чтобы сделать именно это, вы можете удалить типы списка, который вы определили в тесте:

q)test: ([key1:()] col1:();col2:();col3:())
q)test upsert (`key1`col1`col2`col3)!("999";"693";"943";"249")
key1 | col1  col2  col3
-----| -----------------
"999"| "693" "943" "249"

Причина, по которой вы получаете ошибку типа, состоит в том, что "s" соответствует списку символов,не список персонажей.Вы можете проверить это, используя .Q.ty:

q).Q.ty `symbol$()
"s"
q).Q.ty `char$()
"c"

(как правило) не очень хорошая идея установить ключи как вложенный список символов, вам может быть лучше установить их как целые числа ("i") или longs ("j"), как в:

test: ([key1:"j"$()] col1:"j"$();col2:"j"$();col3:"j"$())

При наличии ключей в виде целых / длинных символов функция upsert будет работать хорошо.Также обратите внимание, что таблица - это список словарей, поэтому каждый словарь может быть добавлен отдельно, а также таблица:

q)`test upsert (`key1`col1`col2`col3)!(9;4;6;2)
`test
q)test
key1| col1 col2 col3
----| --------------
9   | 4    6    2
q)`test upsert (`key1`col1`col2`col3)!(8;6;2;3)
`test
q)test
key1| col1 col2 col3
----| --------------
9   | 4    6    2
8   | 6    2    3
q)`test upsert (`key1`col1`col2`col3)!(9;1;7;4)
`test
q)test
key1| col1 col2 col3
----| --------------
9   | 1    7    4
8   | 6    2    3
q)`test upsert ([key1: 8 7] col1:2 4; col2:9 3; col3:1 9)
`test
q)test
key1| col1 col2 col3
----| --------------
9   | 1    7    4
8   | 2    9    1
7   | 4    3    9
0 голосов
/ 22 ноября 2018

У вас есть несколько проблем:

  • массив символов в кавычках - это строка, поэтому не нужно писать string "abc"
  • string "aaa"разделит строку на строки строк
  • ваши начальные определенные типы являются символами "s", а не строками

Это позволит вам вставить в качестве символов:

q)test: ([key1:"s"$()] col1:"s"$();col2:"s"$();col3:"s"$())
q)`test upsert(`key1`col1`col2`col3)!`$("999"; "693"; "943"; "249")
`test

Это сохранит их в виде строк:

q)test: ([key1:()] col1:();col2:();col3:())
q)`test upsert(`key1`col1`col2`col3)!("999"; "693"; "943"; "249")
`test

Посмотрите на различия в метасах двух

HTH, Шон

...