#database #cassandra #cql
#База данных #cassandra #cql
Вопрос:
У меня есть таблица Cassandra со следующей структурой —
CREATE TABLE timeseries_s (
prop_name text PRIMARY KEY,
description text,
value text
);
Теперь мне нужно вставить свойство в эту таблицу, значением которого будет текущая дата в текстовом формате. Я создал следующий CQL, но он выдает мне следующую ошибку —
INSERT INTO timeseries_s (prop_name, description, value) VALUES ('xyz', 'abc', TODATE(now())));
Ошибка — Исключение SyntaxException: строка 1:168 несоответствующих входных данных ‘)’ ожидающих EOF (…’abc’, TODATE(now()))[)]…)
После этого я попробовал ниже —
INSERT INTO timeseries_s (prop_name, description, value) VALUES ('xyz', 'Migration for DSE started at this time', CAST(TODATE(now()) AS TEXT));
Ошибка — Исключение SyntaxException: строка 1:158 нет жизнеспособной альтернативы при вводе ‘(‘ (… ЗНАЧЕНИЯ (‘xyz’, ‘abc’, ПРИВЕДЕНИЕ
Есть предложения?
Ответ №1:
Единственный способ, который я могу придумать, чтобы решить эту проблему исключительно на стороне Cassandra, — это пользовательская функция. Прежде всего, вам нужно включить пользовательские функции в cassandra.yaml
:
enable_user_defined_functions: true
Как только узел (ы) был перезапущен, я выполнил это, определив функцию, вызываемую totext
в моем stackoverflow
пространстве ключей, вот так:
aploetz@cqlsh:stackoverflow> CREATE OR REPLACE FUNCTION totext (input DATE)
RETURNS NULL ON NULL INPUT RETURNS TEXT
LANGUAGE java AS 'return input.toString();';
Создав эту функцию, вы можете использовать ее в своем INSERT
приложении следующим образом:
> INSERT INTO timeseries_s (prop_name, description, value)
VALUES ('xyz', 'Migration for DSE started at this time',
stackoverflow.totext(todate(now())));
> SELECT * FROM timeseries_s ;
prop_name | description | value
----------- ---------------------------------------- ------------
xyz | Migration for DSE started at this time | 2020-09-03
(1 rows)
Ответ №2:
TODATE
принимает column_name
в качестве входных данных. Кроме того, CAST
используется только в SELECT
инструкциях. Вероятно, вы можете добиться этого с помощью программы.