我在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,
我以相同的方式创建了不少表,这从未发生过,所以任何帮助都会受到赞赏.
我把这些id
和score
作为关键来表明这些保持各自的位置.而我正在寻找的实际方案只是作为主键的时间戳.
看起来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
你应该就如何明确的区分你想要的数据呈现以及它是如何有效地呈现给大家.此外,您不应该依赖于字段的序数位置,而只能依赖于它们的名称.
为了提高效率,并且违背您的意愿(您在构建模式时指定了列的顺序),Cassandra需要按特定顺序存储列,为简单起见,这反映了它是如何(CQL接口或驱动程序)将回馈您的数据.
我建议您深入了解Cassandra 如何在了解CQL3如何映射到Cassandra的内部数据结构中存储数据(包括列名!).
顺便说一句,如果你绝对需要在应用程序级别保持你的订单(而且懒得指定SELECT
而不是使用中的所有字段SELECT *
),你需要自己创建一个抽象接口,比如创建一个有序的"字段"名称"数组(您的订单):
String myorder[] = { "timestamp", "id", "score", "type", "publisher_id", "embed_url"};
然后使用序数值将其用作循环中的映射.