如何检查Cassandra表是否存在

如何检查Cassandra表是否存在,cassandra,cql,Cassandra,Cql,是否有一种简单的方法可以检查是否在Cassandra中使用CQL(或者API,使用com.datasax.driver)定义了表(列族) 现在我倾向于执行从表中选择1并检查异常,但也许有更好的方法?从1.1开始,您应该能够查询系统键空间,模式_列族列族。如果知道要检查哪个键空间,此CQL应列出键空间中的所有列族: SELECT columnfamily_name FROM schema_columnfamilies WHERE keyspace_name='myKeyspaceName'; 描

是否有一种简单的方法可以检查是否在Cassandra中使用CQL(或者API,使用com.datasax.driver)定义了表(列族)


现在我倾向于执行
从表中选择1
并检查异常,但也许有更好的方法?

从1.1开始,您应该能够查询
系统
键空间,
模式_列族
列族。如果知道要检查哪个键空间,此CQL应列出键空间中的所有列族:

SELECT columnfamily_name
FROM schema_columnfamilies WHERE keyspace_name='myKeyspaceName';
描述此功能的报告如下所示:

尽管如此,他们还是注意到一些系统列名在1.1和1.2之间发生了更改。因此,你可能不得不稍微处理一下,以获得你想要的结果

编辑20160523-卡桑德拉3.x更新:

请注意,对于Cassandra 3.0及更高版本,您需要对上述查询进行一些调整:

SELECT table_name 
FROM system_schema.tables WHERE keyspace_name='myKeyspaceName';
Java驱动程序(因为您在问题中提到过它)还维护模式的本地表示

驱动程序3.x及以下版本:

keyspacemata ks=cluster.getMetadata().getKeyspace(“myKeyspace”);
TableMetadata table=ks.getTable(“myTable”);
布尔tableExists=(table!=null);
驱动程序4.x及以上版本:

Metadata=session.getMetadata();
布尔表存在=
metadata.getKeyspace(“myKeyspace”)
.flatMap(ks->ks.getTable(“myTable”))
.isPresent();

我只需要使用cqlsh手动检查是否存在表。 可能有用的一般信息

describe keyspace_name.table_name
如果它不存在,您将在键空间“keyspace”中找不到“table_name”
如果它确实存在,您将获得表的描述。

它与CQL 3一起使用,但与CQL 1或2不一起使用:从System.schema_columnfamilies中选择columnfamily,其中keyspace_name='myKeyspaceName';如果有人检查表是否存在,如果不存在,则创建它,则此方法不是线程安全的。若多个线程/客户端同时执行此类操作,select可能不会返回任何结果,但CREATE语句可能已经失败。在这种情况下,最好使用基于异常的解决方案。它不适用于Datastax v3.0驱动程序。将KeyspaceMetadata/TableMetadata用于that@Aaron是否有任何方法(通过查询系统表)可以通过不指定键空间名称来知道表的存在?@Laxmikant是的,如果知道表名称,可以尝试:
SELECT*FROM system\u schema.tables,其中table\u NAME='testmap'允许筛选
由于
system\u模式
keyspace使用
LocalStrategy
,它不会像在常规表上使用
允许筛选
那样效率低下。回答得好!我甚至没有想过要使用
TableMetadata
。太好了!这样,您甚至可以轻松访问列定义。与DataStax驱动程序v3配合使用非常好,谢谢Olivier!我和C++驱动程序的问题是,在我的情况下,每次传输250KB的数据。我当前的实现在启动时获得元数据,这大大提高了速度,但数据是在一个单独的服务中(我有一种形式的代理来访问Cassandra。)所以我认为这是最好的方法(就像在cleanest中一样),只是它真的很慢。对于驱动程序v4,需要额外的
。get()
来打开
可选的
,但除此之外,它仍然有效。