Cassandra create table不会保持列顺序

时间:2015-12-03 17:45:43

标签: cassandra

我在Cassandra中创建一个列族,我希望列顺序与我在create子句中指定的列顺序匹配。

CREATE TABLE cf.mycf (
    timestamp timestamp,
    id text,
    score int,
    type text,
    publisher_id text,
    embed_url text,
    PRIMARY KEY (timestamp, id, score)
) WITH bloom_filter_fp_chance = 0.01
AND comment = ''
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = '99.0PERCENTILE'
AND caching = {
    'keys' : 'ALL',
    'rows_per_partition' : 'NONE'
}
AND compression = {
    'chunk_length_kb' : 64,
    'crc_check_chance' : 1.0,
    'sstable_compression' : 'LZ4Compressor'
}
AND compaction = {
    'base_time_seconds' : 60,
    'class' : 'DateTieredCompactionStrategy',
    'enabled' : true,
    'max_sstable_age_days' : 365,
    'max_threshold' : 32,
    'min_threshold' : 4,
    'timestamp_resolution' : 'MICROSECONDS',
    'tombstone_compaction_interval' : 86400,
    'tombstone_threshold' : 0.2,
    'unchecked_tombstone_compaction' : false
};

应创建一个表格,如: timestamp ,id ,score , type, id ,embed_url

相反,我得到了这个:

timestamp timestamp,
    id text,
    score int,
    embed_url text,
    publisher_id text,
    type text,

我以相同的方式创建了不少表,这从未发生过,所以任何帮助都会受到赞赏。

我将idscore作为键,以表明这些保持各自的位置。而我正在寻找的实际方案只是作为主键的时间戳。

3 个答案:

答案 0 :(得分:6)

看起来cassandra中没有字段顺序。

The others columns are displayed in alphabetical order by Cassandra. 

http://docs.datastax.com/en/cql/3.1/cql/ddl/ddl_compound_keys_c.html

答案 1 :(得分:5)

您应该明确区分希望如何呈现数据以及如何有效地呈现数据。此外,你不应该依赖于字段的序数位置,而只能依赖于它们的名称。

为了提高效率,并且违背您的意愿(您在对模式进行建模时指定了列的顺序),Cassandra需要按特定顺序存储列,为简单起见,这反映了它如何(CQL)接口或驱动程序)将返回您的数据。

我建议您深入了解Cassandra如何在Understanding How CQL3 Maps to Cassandra’s Internal Data Structure中存储数据(包括列名!)。

顺便说一下,如果你绝对需要在应用程序级别保留你的订单(而且懒得指定SELECT中的所有字段而不是SELECT * ),你需要自己创建一个抽象界面,比如创建一个有序的"字段名称"数组(您的订单):

String myorder[] = { "timestamp", "id", "score", "type", "publisher_id", "embed_url"};

然后使用序数值将其用作循环中的映射。

答案 2 :(得分:1)

请记住,cqlsh中DESCRIBE中的CQL字符串的呈现只是对元数据进行迭代的function call in the python driver。它与C *如何存储或发送其结果无关。

如果重要,您可以设置订单。插入时,您可以明确定义订单

INSERT INTO keyspace_name.table_name
  ( identifier, column_name, whatever, order)
  VALUES ( value, value ... )

当您进行选择时,您可以明确定义顺序。

SELECT identifier, whatever, order, column_name FROM keyspace_name.table_name