CQL3和数百万列复合关键用例

时间:2013-09-09 13:27:24

标签: cassandra

我们在CQL3中如何处理数百万列?我们有一个特殊的表,其中所有行基本上都是复合键,而且非常宽。

我正在读这个暗示两种方式的问题 Does collections in CQL3 have certain limits?

此外,我们的复合键的类型是String.bytes,并由STring

排序

我们有一个完全匹配的表,它是Decimal.bytes并按十进制排序。

如何在CQL3中处理此问题?

感谢, 迪安

2 个答案:

答案 0 :(得分:1)

“哦,部分我的问题丢失了,因为SO格式化了它。我正在寻找Decimal.bytes和String.bytes作为我的复合键......没有”价值“ ,只是一个col名称,我希望所有列都是小数> 10和十进制< 20可以这么说,列名称= 10多次出现,如10.a,10.b 11.c,11.d,11 .E“

CREATE TABLE widerow
(    
   row_key text, //whatever
   column_composite1 decimal,
   column_composite2 text,
   PRIMARY KEY(row_key,column_composite1,column_composite2)
)

SELECT * FROM widerow WHERE row_key=... 
AND column_composite1>=10.0
AND column_composite1<=20.0

在这种情况下,您可以使用column_composite1上的范围进行查询,并且对于EACH column_composite1,可以使用不同的column_composite2值(10.a,10.b 11.c,11.d,11.e ...)

“如何在该用例中获取row_composite1&gt;”a“和row_composite1&lt;”b“的所有列?ie。我不关心复合名称的后半部分。”< / em>的

这里有两种可能的解决方案

  1. 使row_composite1成为列
  2. 的复合组件
  3. 使用OrderPreservingPartitioner(确实强烈建议不要这样做)
  4. 对于解决方案1 ​​

     CREATE TABLE widerow
        (    
           fake_row_key text, //whatever
           column_composite1 text, // previously row_composite1
           column_composite2 decimal,
           column_composite3 text,
           PRIMARY KEY(row_key,column_composite1,column_composite2,column_composite3)
        )
    
    SELECT * FROM widerow WHERE row_key=... 
    AND column_composite1>='a'
    AND column_composite1<='b'
    

    这种建模有一些缺点。为了能够通过DOUBLE值进行查询范围,您需要首先提供column_composite1:

    SELECT * FROM widerow WHERE row_key=... 
    AND column_composite1='a'
    AND column_composite2>=10.0
    AND column_composite2<=20.0
    

答案 1 :(得分:0)

CREATE TABLE widerow
(    
   row_composite1 text,
   row_composite2 text,
   column_name decimal,
   value text, 
   PRIMARY KEY((row_composite1,row_composite2),column_name)
)

SELECT * FROM widerow WHERE row_composite1=... 
AND row_composite2=...
AND column_name>=10.0
AND column_name<=20.0
ORDER BY column_name DESC