我不想要密钥空间中任何表中的任何数据。所以我决定删除键空间(如果存在)并立即创建它。我使用下面的代码来实现相同的目标。
CassandraConnector(conf).withSessionDo { session =>
session.execute(s"DROP KEYSPACE if EXISTS $keyspace")
session.execute("""CREATE KEYSPACE if NOT EXISTS %s
WITH replication = {'class':'SimpleStrategy','replication_factor':'1'};""".format(keyspace)
) }
但它未能创建密钥空间。从日志中我只能看到一条警告,说明
Received a DROPPED notification for table test.table_tracker, but this keyspace is unknown in our metadata.
我也尝试过使用python cassandra驱动程序。但结果是一样的。 我相信有一些竞争条件,并且丢弃键空间发生异步(如果我错了,请纠正我)。
如何同步删除和创建键空间?
答案 0 :(得分:6)
如果您只想删除表中的所有数据,则应考虑使用TRUNCATE从表中删除所有数据,同时保留其模式,即:
TRUNCATE test.table_tracker;
应该谨慎地执行架构更改,因此您应尽可能避免使用它。此外,所有版本的cassandra都会在快速删除和重新创建键空间时出现许多不同的问题,因此截断路径更加可靠。
您可能遇到的一个问题是,在执行每个可能有问题的操作之后,您可能没有等待架构协议,尤其是在后续操作中操作相同的键空间/表时。 java驱动程序(以及spark连接器)只会在架构更改之间等待一段可配置的时间。请参阅java-driver metadata doc中的此指南,以获取有关如何等待协议的指导,即:
if (cluster.getMetadata().checkSchemaAgreement()) {
// schema is in agreement
} else {
// schema is not in agreement
}