我尝试定义一些类型,并使用它创建一个表,如下所示:
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,[)]...)
2条答案
按热度按时间nimxete21#
这里有几个错误:
videos
之后和)
之前有,
-删除它movie.movies
表定义没有id
列但实际上,我不认为
videos LIST<FROZEN<videos>>
的定义是一个好的实践-相反,将每个视频实现为单独的行。kqlmhetl2#
在您发布的CQL语句中有几个语法错误,特别是对于模式,我认为您已经修复了,因为否则它们将无法执行。
在任何情况下,
INSERT
语句都会因为第四行的错误而失败,如错误消息所示:其具体为
)values(
。CQL解析器不需要右括号(
no viable alternative at input ')'
),因为行号3的末尾有一个逗号(,
)(videos,
)。CQL语句的正确格式为:
我们建议您使用此格式作为报表的模板,以便更容易发现错误。
顺便说一下,对于你没有问的问题,我们不建议使用像
list
这样的CQL集合类型来处理可能无限增长的数据。我们还建议你避免使用用户定义类型(UDT),因为它们会给你的应用程序增加复杂性,特别是因为你是Cassandra的新手。你应该尽可能地使用通用列类型。例如,将注解存储在这样的表中会更有意义:
这样,您可以使用以下命令检索电影的所有评论:
以这种方式对数据进行建模可以避免(1)处理CQL集合和UDT的复杂性,(2)获得更好的性能,因为表针对读取进行了优化。干杯!