过滤并排序在Cassandra表

时间:2017-05-30 13:47:15

标签: database cassandra

假设我在Cassandra表中有一个文本列。此列具有以文本方式表示的数值,例如

|...|...|myTextColumn|...|...|
|...|...|   '1000'   |...|...|
|...|...|    '200'   |...|...|
|...|...|    '35'    |...|...|

如果我使用索引,我可以通过myTextColumn进行查询,并要求所有小于300的值:

select * from myTable where myTextColumn<'300' ALLOW FILTERING ; 

通过这样做,我有一个三重问题:

  1. 结果
  2. 中列出myTextColumn ='1000'的行
  3. myTextColumn ='35'的行未在结果中列出
  4. 排序结果将在'200'之前显示'1000',在'35'之前显示'200'
  5. 请注意,我理解为什么会发生这种情况,为什么我的问题。我的问题是,是否有可能解决这个问题,如果是这样,如果不再采用以下方法: i)更改列类型 ii)添加前导零以便全部值具有相同的位数。

    感谢您的时间。最好的问候。

1 个答案:

答案 0 :(得分:2)

我仅使用查询无法解决此问题。但是我最终通过在myTextColumn中插入的数值添加一个额外的数字来解决它。

所有数字变量都以其自己的数字位数为前缀,例如一千是41000,二百是3200.当然,四万一千是541000,三万二千是43200.

为了确保前缀始终是一个数字,即使对于大数字,我们可以使用Base16(如果我们想要支持更大的数字,则为24或32),例如A1234567890。

这可确保始终正确过滤并排序结果。

为了跟进原始示例,该表变为:

|...|...|myTextColumn|...|...|
|...|...|   '41000'  |...|...|
|...|...|    '3200'  |...|...|
|...|...|    '235'  |...|...|

因此,如果我执行查询:

select * from myTable where myTextColumn<'3300' ALLOW FILTERING ; 

我将获得{235,3200},其中包含正确顺序的正确结果。