【问题标题】:How to list all cassandra tables如何列出所有 cassandra 表
【发布时间】:2016-12-06 09:13:39
【问题描述】:

cassandra 数据库中有很多表,其中包含标题为 user_id 的列。值 user_id 是指存储在表 users 中的用户。由于删除了一些用户,我想删除所有包含标题为 user_id 列的表中的孤立记录。

有没有办法使用 CassandraSQLContext 或任何其他内置方法或自定义过程列出所有表,以避免显式定义表列表?

【问题讨论】:

    标签: scala apache-spark cassandra spark-cassandra-connector


    【解决方案1】:

    有一些系统表可以提供有关存储的键空间、表、列的信息。

    尝试在 cqlsh 控制台中运行以下命令:

    1. 获取键空间信息

      SELECT * FROM system.schema_keyspaces ;

    2. 获取表格信息

      SELECT columnfamily_name FROM system.schema_columnfamilies WHERE keyspace_name = 'keyspace name';

    3. 获取表信息

      SELECT column_name, type, validator FROM system.schema_columns WHERE keyspace_name = 'keyspace name' AND columnfamily_name = 'table name';

    从 v 5.0.x 开始 Docs

    1. 获取键空间信息

      SELECT * FROM system_schema.keyspaces;

    2. 获取表格信息

      SELECT * FROM system_schema.tables WHERE keyspace_name = 'keyspace name';

    3. 获取表信息

      SELECT * FROM system_schema.columns WHERE keyspace_name = 'keyspace_name' AND table_name = 'table_name';

    自 6.0 版起 Docs

    1. 获取键空间信息

      SELECT * FROM system_schema.keyspaces

    2. 获取表格信息

      SELECT * FROM system_schema.tables WHERE keyspace_name = 'keyspace name';

    3. 获取表信息

      SELECT * FROM system_schema.columns WHERE keyspace_name = 'keyspace_name' AND table_name = 'table_name';

    【讨论】:

    • 对于我的 cassandra [cqlsh 5.0.1 | Cassandra 3.11.3 | CQL spec 3.4.4 | Native protocol v4] 版本,获取密钥空间信息适用于 SELECT * FROM system_schema.keyspaces
    • 获取表格信息SELECT * FROM system_schema.tables WHERE keyspace_name = 'keyspace name'
    【解决方案2】:

    您可以使用 datastax 核心驱动程序和集群元数据来实现您想要的。这是一个示例,它将列出您的键空间中的所有表以及每个表中的列:

     Cluster cluster= Cluster.builder().addContactPoint(clusterIp).build();
        Metadata metadata =cluster.getMetadata();
    
       Collection<TableMetadata> tablesMetadata= metadata.getKeyspace("mykeyspacename").getTables();
        for(TableMetadata tm:tablesMetadata){
            System.out.println("Table name:"+tm.getName());
            Collection<ColumnMetadata> columnsMetadata=tm.getColumns();            
            for(ColumnMetadata cm:columnsMetadata){
                String columnName=cm.getName();
                System.out.println("Column name:"+columnName);
            }
        }
    

    【讨论】:

      【解决方案3】:

      cqlsh执行describe tables;

      【讨论】:

      • 这是列出所有表格的当前最简单的方法
      • 为了完整起见,先运行use my_keyspace;
      • 是否可以按字母顺序排列输出?
      • 为我工作,确保执行use keyspace_name; 否则您将获得所有键空间的结果。
      【解决方案4】:

      对于 DSE。如果稍后发布检查 system_schema 键空间。 来自

      cqlsh > desc keyspaces;
      
      spark_system  system_schema  "OpsCenter"  cfs_archive         "HiveMetaStore"
      system_auth    cfs          demobeta            dsefs          
      dse_security  hypermedia     dse_leases   system_traces       dse_perf       
      solr_admin    system         system_distributed  dse_system
      

      如果您看到“system_schema”,则表的元数据位于此键空间中。

      cqlsh>use system_schema;
      
      cqlsh>select keyspace_name,table_name from tables where keyspace_name = 'system';
      

      【讨论】:

      • system 键空间不是 DSE 特定的 - 它是 Cassandra 的核心功能...... Cassandra 版本之间的模式表示不同,因此最好的方法是使用 cqlsh 的 @ 987654326@,或通过@zoran jeremic 指出的元数据访问
      • alex,从来没有暗示系统密钥空间是特定于 DSE 但是有些是。模式表已移出“系统”键空间,因此表系统键空间不再位于该键空间中..这是针对 DSE 而不是开源 Cassandra 的特定答案。仅指 DSE 的元数据。描述表;如发布的那样,获取表格列表非常简单。评论是围绕 DSE 而不是 Open Source 的元数据。如果您正在寻找那些不在 DSE 中的系统表。如果尝试在您的应用程序中生成表列表有时无法运行 desc 但需要运行 cql...
      • 系统键空间特定于 Cassandra。您描述的区别是 Cassandra 2.x 和 3.x 之间的区别(请参阅dba.stackexchange.com/questions/134185/…)。 DSE 特定的键空间通常具有dse 前缀,例如dse_securitydse_leases 等(尽管cfssolr_admin 不遵循此约定)。总体而言,如果您需要以编程方式访问这些数据,那么最好使用支持 Metadata 的驱动程序 - 它与版本无关。
      【解决方案5】:

      列出所有表(仅表名),

      DESC tables;

      列出所有表和模式(CQL 创建语句),

      DESC {$KEYSPACE_NAME}{$KEYSPACE_NAME} 是键空间的名称。

      我使用的是从官网下载的Apache Cassandra 3.11.4二进制包:

      cql> show version;
      [cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4]
      

      Apache Cassandra 的 CQL 参考在这里:https://cassandra.apache.org/doc/cql3/CQL-3.0.html

      【讨论】:

        【解决方案6】:

        尝试运行以下查询:

        cqlsh> describe keyspace <keyspace_name>;
        

        【讨论】:

        • cqlsh: 描述键空间 ;
        【解决方案7】:

        只需连接 CQLSH 并尝试以下命令

        描述表格;或

        DESC 架构;

        您还可以“描述键空间;”和“使用键空间;”您想在哪里查看带有“描述表格”的表格;

        【讨论】:

        • describe schema 不是 CQL 命令,而是cqlsh 命令...
        • @AlexOtt 是的,我的意思是在连接 cqlsh 之后。
        【解决方案8】:
        desc keyspaces;  // list all databases/collections names
        use anyKeyspace;  // select any database
        desc tables;      // list all tables in collection/ database
        
        

        【讨论】:

        • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
        猜你喜欢
        • 2016-11-03
        • 2022-08-11
        • 2012-07-08
        • 2013-09-13
        • 2010-12-07
        • 1970-01-01
        • 2014-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多