1

我有一个方案如下:

  • 时间戳
  • 设备编号
  • 设备名称
  • 设备所有者
  • 设备位置

我使用 CQL 创建了这个列族,并将主键定义为(TimeStamp,Device ID, Device Name). 通过一个可序列化的对象,该对象具有 DeviceID、名称和字段名称(存储Device OwnerDevice Location)的字段。我使用 Astyanax 插入了一些记录。

根据我的理解,一行的列是通过组合创建的Device IDDevice Name字段名称作为列名称,值是该特定字段的值。因此,对于特定的时间戳和设备,列名将采用 pattern (Device ID:Device Name: ...)

所以我相信我们可以使用这两个字段作为前缀来获取特定时间设备组合的所有条目。

我正在使用以下查询来获取结果:

  RowSliceQuery<String, ApBaseData> query = adu.keyspace
  .prepareQuery(columnFamily)
  .getKeySlice(timeStamp)
  .withColumnRange(new RangeBuilder()
   .setStart(deviceID+deviceName+"_\u00000")
   .setEnd(deviceID+deviceName+"_\uffff")
   .setLimit(batch_size)
   .build());

但是在执行上述查询时,我得到以下异常:

BadRequestException:[主机=本地主机(127.0.0.1):9160,延迟=6(6),尝试=1]InvalidRequestException(为什么:没有足够的字节来读取组件0的值)

@abhi 我在这个列族中可以拥有的数据如下:

    stime    |  devName  | devId | Owner | Location
  1361260800 | dev:01:02 |   1   | 1234  |    1  
  1361260800 | dev:02:03 |   2   | 34    |    2
  1361260800 | dev:05:06 |   1   | 12    |    1
  1361260800 | dev:03:02 |   2   | 56    |    3

我为此使用的 java 可序列化 java 类是:

public class BaseData implements Serializable {
    private static final long serialVersionUID = 1L;
    @Component(ordinal = 0)
    private String devName;
    @Component(ordinal = 1)
    private int devID;
    @Component(ordinal = 2)
    private String field;
}

按照上述类的结构,我可以将列族中的列视为: 列名:dev\:01\:02:1:location 列值:00000001

仅供参考,使用 astyanax 1.56.31

4

3 回答 3

1

您可以将 PlayOrm 用于 cassandra(我听说最新的现在也在 mongodb 上工作)。使用它,您可以创建一个实体并将 @NoSqlPartitionByField 注释添加到 beginOfMonthTimestamp 和 deviceId 列,此外还有时间戳列。然后,您可以像这样查询分区

PARTITIONS s('time', :partitionId) select s from TABLE as s where s.deviceName='mike'

仅当您确定您的分区不会超过数百万时,才可以这样做。你可以有无限的分区。所以基本上,你可以使用 beginOfMonth 或 beginOfWeek ,这取决于东西进入系统的速度。有更多信息在

http://buffalosw.com/wiki/playorm-documentation/

于 2013-04-03T12:31:54.017 回答
1

这里有两件事,
1.您在设备 ID 中使用“:”,Cassandra 也将其用于复合列。因此,如果可以,请避免使用它。
2. 根据您的测试数据,您的列名显示为“dev\:01\:02:1:location”,即 devicename+deviceid+location。但是,您在查询中给出了 deviceID+deviceName+"_\u00000" ?

于 2013-04-03T12:53:05.757 回答
0

为了克服这个问题,我改变了在表中存储数据的方式。我没有使用复合主键,而是更改了架构,以便只有单个主键和动态列。所以,现在我在 stime 上有主键,我的列名是由我的插入代码显式动态构造的。例如。"dev\:01\:02:1:location" 与以前相同,但这完全消除了对序列化对象的需求。到目前为止,这已经解决了我的问题。让我们看看它会带来什么问题。

于 2013-04-09T11:15:59.870 回答