3

我不希望键空间中任何表中的任何数据。所以我决定删除键空间(如果存在)并立即创建它。我正在使用下面的代码来实现相同的目的。

 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 驱动程序。但结果是一样的。我相信存在一些竞争条件,并且丢弃键空间发生异步(如果我错了,请纠正我)。

如何同步删除和创建键空间?

4

1 回答 1

8

如果您只是想从表中删除所有数据,则应考虑使用TRUNCATE删除表中的所有数据,同时保留其模式,即:

TRUNCATE test.table_tracker;

应谨慎执行架构更改,因此应尽可能避免。此外,在所有版本的 cassandra 中,围绕快速删除和重新创建密钥空间存在许多不同的问题,因此截断路由更加可靠。

您可能遇到的一个问题是,您可能在执行每个操作后没有等待模式协议,这可能会出现问题,尤其是在后续操作中操作相同的键空间/表的情况下。java-driver(以及 spark 连接器)只会在模式更改之间等待最多可配置的时间。有关如何等待协议的指导,请参阅java-driver 元数据文档中的此指导,即:

if (cluster.getMetadata().checkSchemaAgreement()) {
    // schema is in agreement
} else {
    // schema is not in agreement
}
于 2015-08-10T19:37:18.907 回答