2013-08-22 3 views
7

Я пытаюсь получить имена столбцов, но не смог получить только имена столбцов.в cassandra-cli как получить все имена столбцов в таблице и как получить его с помощью hector в java?

В кли я выполнил команду 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 я пытаюсь, используя следующую команду в консоли:

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:

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] 

ответ

10

В Cassandra 1.1, которая будет действительно работать, однако семья schema_columnfamilies столбец был изменен с тех пор.

Bad Request: Undefined name column_name in selection clause

В информации 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 о том, что такое содержимое системного ключа.

+0

ya .. Я пробую все эти возможные вещи. Тем не менее это приводит к ошибке .. по запросу 'SELECT column_aliases FROM system.schema_columnfamilies WHERE keyspace_name = 'ianew' AND columnfamily_name = 'nodes';', Это возвращало результат: 'column_aliases ----------- ----- [] ' –

+0

@NDThokare Я отредактирую вопрос. Мы на самом деле после schema_columns CF, а не schema_columnfamilies: http://www.datastax.com/dev/blog/the-data-dictionary-in-cassandra-1-2 –

+0

спасибо @Lyuben, это правильно .. теперь я получил результат с помощью 'SELECT column_name FROM system.schema_columnfamilies WHERE keyspace_name = 'ianew' AND columnfamily_name = 'nodes';' –