让我们假设一个设备可以随机提供n个信号。我们在一段时间内从m个设备收集这些数据。所以我们的'元架构'是
DeviceId : int
SignalId : int
SignalDateTime : DateTime (with mSec as YY-MM-DD HHMMSS.mm)
ExtraData : String
我想将这些数据放入cassandra,我试图了解各种方法。我希望能够通过三个值(DeviceId,SignalId,SignalDateTime)的任意组合来获取数据。
我可以想象使用DeviceId作为行键,然后配对SignalDateTime:SignalId。但那么我如何处理ExtraData?也许把它变成一个超级列?类似地,我可以使用DeviceId和SignalDateTime创建唯一的行键,但这是使用Cassandra的合理方法吗?
答案 0 :(得分:3)
使用Cassandra,您真的要从您打算对数据进行的不同查询开始,然后从那里向后工作到相应的列族定义。理想情况下,您所做的每个查询都将从一行中选择数据。如果您希望在能够通过不同字段进行查询的同时实现此目的,则需要跨多个列族对该数据进行非规范化。
您可以从以下列系列开始:
CF1
RowKey: DeviceID
ColumnNames: SignalDateTime
Value: Serialized [SignalID + ExtraData]
CF2
RowKey: SignalID
ColumnName: SignalDateTime
Value: Serialized [DeviceID + ExtraData]
该值将是* ID + ExtraData的一些序列化形式(使用JSON,ProtocolBuffers等)。使用此模式,您可以从时间t0到t1查询Device1中的所有数据,或者从T0到t1查询Signal1中的所有数据。
也许您还想从t0到t1查询DeviceID和SignalID。在这种情况下,使用复合列是有意义的:
CF3
RowKey: DeviceID
ColumnName: CompositeColumn[SignalID:SignalDateTime]
Value: ExtraData
要查询此列族,您可以根据SignalID的切片列和时间范围内的时间来获取行。 pycassa文档解释了一些basics of composite columns。