Как преобразовать значение типа даты в текст в Cassandra?

#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 инструкциях. Вероятно, вы можете добиться этого с помощью программы.