【发布时间】:2013-04-09 19:15:59
【问题描述】:
我有一个方案如下:
- 时间戳
- 设备 ID
- 设备名称
- 设备所有者
- 设备位置
我使用 CQL 创建了这个列族,并将主键定义为 (TimeStamp,Device ID, Device Name)。通过具有 DeviceID、名称和字段名称(存储Device Owner 或Device Location)字段的可序列化对象。我使用 Astyanax 插入了一些记录。
根据我的理解,一行的列是通过将Device ID、Device Name 和字段名称组合为列名称和值作为该特定字段的值来创建的。
因此,对于特定的时间戳和设备,列名将采用(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:[host=localhost(127.0.0.1):9160,latency=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
【问题讨论】:
-
您可以粘贴您的创建表语句吗?问题是你的列类型是 CompositeType 所以你需要在不使用 CQL 时进行序列化。
-
@Michael Härtl 这是我的创建表语句:CREATE TABLE perf_sample (stime ascii, devName ascii, devId int, devOwner int, devLocation int, PRIMARY KEY (stime, devName, devID))
-
问题已了解。我也看过你的另一篇文章,所以如果你能分享一些 CF 数据会更好,这样任何人都可以在他们的本地进行测试,并可能以有效的方式帮助你。
-
@abhi 我已经添加了有关上述数据的信息