我有一个方案如下:
- 时间戳
- 设备编号
- 设备名称
- 设备所有者
- 设备位置
我使用 CQL 创建了这个列族,并将主键定义为(TimeStamp,Device ID, Device Name)
. 通过一个可序列化的对象,该对象具有 DeviceID、名称和字段名称(存储Device Owner
或Device Location
)的字段。我使用 Astyanax 插入了一些记录。
根据我的理解,一行的列是通过组合创建的Device ID
,Device 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