【问题标题】:in cassandra-cli how to get all column names in a table and how to get it using hector in java?在 cassandra-cli 中如何获取表中的所有列名以及如何在 java 中使用 hector 获取它?
【发布时间】:2026-01-18 14:45:02
【问题描述】:

我正在尝试获取列名,但无法仅获取列名。

在cli中我执行了命令describe table nodes,它返回了结果:

CREATE TABLE nodes (
  key text PRIMARY KEY,
  id text,
  scores text,
  topic1 text,
  topic2 text,
  topic3 text,
  topic4 text,
  topics text
) WITH COMPACT STORAGE AND
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=864000 AND
  read_repair_chance=0.100000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'SnappyCompressor'};

CREATE INDEX idx_nodes_id ON nodes (id);

正如question 中给出的,我尝试在 cli 中使用以下命令:

SELECT column_name FROM system.schema_columnfamilies WHERE keyspace_name = 'ianew' AND columnfamily_name = 'nodes';

但它给出了错误:

Bad Request: Undefined name column_name in selection clause
Perhaps you meant to use CQL 2? Try using the -2 option when starting cqlsh.

然后我尝试了:

SELECT * FROM system.schema_columnfamilies WHERE keyspace_name = 'ianew' AND columnfamily_name = 'nodes';

它返回了以下所有内容:

    keyspace_name | columnfamily_name | bloom_filter_fp_chance | caching   | column_aliases | comment | compaction_strategy_class                                       | compaction_strategy_options | comparator                               | compression_parameters                                                      | default_read_consistency | default_validator                        | default_write_consistency | gc_grace_seconds | id   | key_alias | key_aliases | key_validator                            | local_read_repair_chance | max_compaction_threshold | min_compaction_threshold | populate_io_cache_on_flush | read_repair_chance | replicate_on_write | subcomparator | type     | value_alias
---------------+-------------------+------------------------+-----------+----------------+---------+-----------------------------------------------------------------+-----------------------------+------------------------------------------+-----------------------------------------------------------------------------+--------------------------+------------------------------------------+---------------------------+------------------+------+-----------+-------------+------------------------------------------+--------------------------+--------------------------+--------------------------+----------------------------+--------------------+--------------------+---------------+----------+-------------
         ianew |             nodes |                   null | KEYS_ONLY |             [] |         | org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy |                          {} | org.apache.cassandra.db.marshal.UTF8Type | {"sstable_compression":"org.apache.cassandra.io.compress.SnappyCompressor"} |                     null | org.apache.cassandra.db.marshal.UTF8Type |                      null |           864000 | null |      null |          [] | org.apache.cassandra.db.marshal.UTF8Type |                        0 |                       32 |                        4 |                      False |                0.1 |               True |          null | Standard |        null

正如post 中给出的,我尝试在 java 中使用 hector:

SliceQuery<String, String, String> query = HFactory.createSliceQuery(keyspace, StringSerializer.get(), StringSerializer.get(),  StringSerializer.get());
query.setColumnFamily(columnFamilyName);
query.setKey("key");
query.setRange(null, null, false, Integer.MAX_VALUE);

ColumnSliceIterator<String, String, String> iterator = new ColumnSliceIterator<String, String, String>(query, null, "\uFFFF", false);

while (iterator.hasNext()) {
    HColumnImpl<String, String> column = (HColumnImpl<String, String>) iterator.next();
    System.out.println("Column name = " + column.getName() + "; Column value = " + column.getValue());
    colNames.add(column.getName());
}

但它没有返回结果。

我希望输出类似于:

TABLE nodes:
Columns: key text PRIMARY KEY, id text, scores text, topic1 text, topic2 text, topic3 text, topic4 text, topics text

通过赫克托得到类似的结果。

我正在使用的版本:

[cqlsh 2.3.0 | Cassandra 1.2.4 | CQL spec 3.0.0 | Thrift protocol 19.35.0]

【问题讨论】:

    标签: java cassandra hector cassandra-cli


    【解决方案1】:

    在 cassandra 1.1 中确实可以工作,但此后 schema_columnfamilies 列族已被修改。

    错误请求:选择子句中未定义名称 column_name

    在 Cassandra 1.2.x 中,有关列的信息位于名为 schema_columns 的单独键空间中,具有以下架构:

    CREATE TABLE schema_columns (
      keyspace_name text,
      columnfamily_name text,
      column_name text,
      component_index int,
      index_name text,
      index_options text,
      index_type text,
      validator text,
      PRIMARY KEY (keyspace_name, columnfamily_name, column_name)
    );
    

    尝试以下方法:

     SELECT * FROM system.schema_columns 
     WHERE keyspace_name = 'ianew' AND columnfamily_name = 'nodes';
    

    Documentation关于系统keyspace的内容是什么。

    【讨论】:

    • 是的。我尝试了所有可能的事情。仍然导致错误..通过查询SELECT column_aliases FROM system.schema_columnfamilies WHERE keyspace_name = 'ianew' AND columnfamily_name = 'nodes';,返回结果:column_aliases ---------------- []
    • @NDThokare 我将编辑问题。我们实际上是在使用 schema_columns CF 而不是 schema_columnfamilies:datastax.com/dev/blog/the-data-dictionary-in-cassandra-1-2
    • 感谢@Lyuben,没错..现在我使用SELECT column_name FROM system.schema_columnfamilies WHERE keyspace_name = 'ianew' AND columnfamily_name = 'nodes';得到了结果
    • 但问题解决了一半。我们如何在 java 中使用 hector 来做到这一点?