2012-05-19 53 views
4

我想创建一个超级列族,它将复制像这样的结构。Cassandra超级列族模式创建

{ 'hd': 
    '2008/12/12 10:03': { metric1: 'blah', metric2: 'blah'} 
    '2008/12/2 9:03': { metric1: 'blah', metric2: 'blah'} 
    'cpu': 
    '2008/12/12 10:03': { metric1: 'blah', metric2: 'blah'} 
    '2008/12/2 9:03': { metric1: 'blah', metric2: 'blah'} 
} 

我现在的尝试是这样的:

create column family Timestep 
with column_type = 'Super' 
and comparator = 'AsciiType' 
and subcomparator = 'DateType' 
and default_validation_class = 'DoubleType' 
and key_validation_class = 'AsciiType' 
and column_metadata = [ 
    {column_name : metric1, validation_class : DoubleType} 
    {column_name : metric2, validation_class : DoubleType} 
]; 

但是,如果我尝试和卡桑德拉-CLI运行上面:

java.lang.RuntimeException: org.apache.cassandra.db.marshal.MarshalException: unable to coerce 'open' to a formatted date (long) 

也许我不理解什么是超列家庭是正确的,但任何帮助将是真棒。

谢谢。

回答

4

它是非常强烈建议您不要使用超级柱,特别是在新设计中。它们从来没有没有问题,现在它们已被弃用,并且更容易被组合键取代。

你的数据可以很好地这样表示在CQL 3,例如:

CREATE TABLE Timestep (
    hardware ascii, 
    when timestamp, 
    metric1 double, 
    metric2 double, 
    PRIMARY KEY (hardware, when) 
); 

,或者根据实际需要的内容有,它可能是更明智的使用方法:

CREATE TABLE Timestep (
    hardware ascii, 
    metricname ascii, 
    when timestamp, 
    value double, 
    PRIMARY KEY (hardware, metricname, when) 
) WITH COMPACT STORAGE; 

有关更多信息,请参阅this article,了解这些信息如何转化为Cassandra中的存储引擎行宽。

2

我可以知道你在使用哪个API吗? 如果是赫克托,那么我可以帮你。但我个人 建议你不要使用超级列,因为,从超级列获取子列列表 是一个令人头疼的问题。另外还有很多与性能相关的问题。 此外,超级列已被弃用。所以最好用组合键。