cassandra 插入到表中将返回“SyntaxException:第4行:0在输入')'处没有可行的替代项(....movies(id,videos,[)]...)”

pdkcd3nj  于 2023-04-06  发布在  Cassandra
关注(0)|答案(2)|浏览(129)

我尝试定义一些类型,并使用它创建一个表,如下所示:

CREATE KEYSPACE IF NOT EXISTS movie WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 3};
    
CREATE TYPE movie.comment (ratings LIST<BOOLEAN>,);
    
CREATE TYPE movie.videos (comments LIST<FROZEN<comment>>);
    
CREATE TABLE IF NOT EXISTS movie.movies (videos LIST<FROZEN<videos>>,);

它们将被成功创建。但是当我尝试将一些变量INSERT到表中时,如下所示,我得到以下错误:

INSERT INTO movie.movies(
  id,
  videos,
)values(
  'id', 
  [{
    comments: 
        [true, false,false]
  }]
);

错误:

SyntaxException: line 4:0 no viable alternative at input ')' (....movies(  id,  videos,[)]...)
nimxete2

nimxete21#

这里有几个错误:

  • videos之后和)之前有,-删除它
  • 您的movie.movies表定义没有id
  • 您没有为表定义主键

但实际上,我不认为videos LIST<FROZEN<videos>>的定义是一个好的实践-相反,将每个视频实现为单独的行。

kqlmhetl

kqlmhetl2#

在您发布的CQL语句中有几个语法错误,特别是对于模式,我认为您已经修复了,因为否则它们将无法执行。
在任何情况下,INSERT语句都会因为第四行的错误而失败,如错误消息所示:

SyntaxException: line 4:0 ...

其具体为)values(
CQL解析器不需要右括号(no viable alternative at input ')'),因为行号3的末尾有一个逗号(,)(videos,)。
CQL语句的正确格式为:

INSERT INTO movie.movies (id, videos) VALUES (...)

我们建议您使用此格式作为报表的模板,以便更容易发现错误。
顺便说一下,对于你没有问的问题,我们不建议使用像list这样的CQL集合类型来处理可能无限增长的数据。我们还建议你避免使用用户定义类型(UDT),因为它们会给你的应用程序增加复杂性,特别是因为你是Cassandra的新手。
你应该尽可能地使用通用列类型。例如,将注解存储在这样的表中会更有意义:

CREATE TABLE comments_by_movie_title (
    movie_title text,
    comment_id text,
    comment text,
    rating boolean,
    PRIMARY KEY (movie_title, comment_id)
)

这样,您可以使用以下命令检索电影的所有评论:

SELECT comment, rating FROM comments_by_movie_title
  WHERE movie_title = ?

以这种方式对数据进行建模可以避免(1)处理CQL集合和UDT的复杂性,(2)获得更好的性能,因为表针对读取进行了优化。干杯!

相关问题