所以,我有一个表叫做“tracks”(audio_streaming
keyspace),我尝试更改其主键。由于DROP TABLE tracks PRIMARY KEY
不起作用,我尝试将现有表tracks
克隆到temp_tracks
中,然后删除原始表,然后创建一个具有自动递增主键的新表,然后将临时表中的值复制到新表中。我尝试执行以下代码:
INSERT INTO temp_tracks (author, name, duration, explicit, quality, release_date)
SELECT author, name, duration, explicit, quality, release_date FROM tracks;
它给了我这个错误:
SyntaxException: line 2:0 mismatched input 'SELECT' expecting K_VALUES (... explicit, quality, release_date)[SELECT]...)
还有,有没有更简单的方法来改变主键?
任何人都可以帮助我了解是什么原因导致这个错误,以及如何修复它?提前感谢您可以提供的任何帮助.
2条答案
按热度按时间rt4zxlrg1#
上面的异常是因为CQL不允许子查询而触发的。您正在运行
INSERT
或SELECT
,但您不能同时执行这两个操作。也不能将SELECT
作为INSERT
的输入运行。所以有两种选择。
1.使用cqlsh
COPY
命令。基本上,您将一个表复制到一个.csv/.txt文件。然后,您通过运行COPY FROM文件到新表来反向执行该过程。1.使用DSBulk实用程序。在这个场景中,您将对一个文件运行
dsbulk unload
,然后对新表运行dsbulk load
。这两种方法都可以工作,尽管DSBulk在处理大量数据方面做得更好。因此,如果行数为数千,cqlsh COPY应该没问题。如果行数为一百万或更多,请使用DSBulk。
0h4hbjxa2#
CQL语法不支持将数据从一个表复制到另一个表的SQL语法,如:
Cassandra专为OLTP工作负载而设计,其中读取针对单分区检索进行了优化。
相比之下,将数据从一个表复制到另一个表更接近于分析工作负载,需要进行无法扩展的全表扫描。想象一下,如果您在分布在数百个节点上的表中有数十亿条记录-复制查询将花费很长时间并可能超时。Cassandra根本不是为处理这种操作而设计的。
现有的最接近的CQL语法是用于创建包含
AS SELECT
子句的物化视图:此DDL语句创建一个MV表,该表由基表中的数据填充。但是,数据“复制”会在一段时间内异步进行,具体取决于基表中存在的数据量。复制是异步的,因为它同样需要全表扫描,如果不进行节流,则会影响集群的性能。
顺便说一下,物化视图被归类为实验性的,所以我不建议在生产环境中使用它,除非(1)你有一个好的understanding of how it works,(2)know its limitations。我在这篇文章中更详细地解释了它-https://dba.stackexchange.com/questions/325482/。
您的选项包括:
如果您决定使用DSBulk路径,这里有一些资源可以帮助您快速入门: