【问题标题】:Cassandra timeseries datamodelCassandra 时间序列数据模型
【发布时间】:2013-08-02 00:20:05
【问题描述】:

假设有 10 个设备(dev01,dev02,dev03..etc)。

它以一定的间隔时间发送数据,我们收集这些数据,所以我们的数据模式是

 dev01      :int
 signalname :string
 signaltime :date/time[with YY-MM-DD HHMMSS.mm]
 Extradata  :String

我想将数据推送到 cassandra 中,哪种方式存储这些数据最好?

我的查询是这样的,

1 需要检索基于设备的当前日期数据,或某些日期范围?

2 5 设备当前日期数据?

我不确定以下将数据存储到 cassadra 中的方式是否是最佳模型

Standard columnfamily Name:signalname
row key                   :dev01
columnname                :timeseries(20120801124204)[YYMMDD HHMMSS]
columnvalue               :Json data
columnname                :timeseries(20120801124205)[YYMMDD HHMMSS][next second data]
columnvalue               :Json data

row key               :dev02
columnname            :timeseries(20120801124204)[YYMMDD HHMMSS]
columnvalue           :Json data
columnname            :timeseries(20120801124205)[YYMMDD HHMMSS][next second data]
columnvalue           :Json data

Or  

Super columnfamily   :signalname
row key              :Clientid1

supercolumnname      :dev01
columnname           :timeseries(20120801124204)[YYMMDD HHMMSS]
columnvalue          :Json data

supercolumnname      :dev02
columnname           :timeseries(20120801124204)[YYMMDD HHMMSS]
columnvalue          :Json data


row key              :Clientid2

supercolumnname      :dev03
columnname           :timeseries(20120801124204)[YYMMDD HHMMSS]
columnvalue          :Json data

supercolumnname      :dev04
columnname           :timeseries(20120801124204)[YYMMDD HHMMSS]
columnvalue          :Json data

请帮我解决这个问题, 还有其他方法吗?

谢谢&问候, 观音

【问题讨论】:

    标签: nosql cassandra datamodel phpcassa cassandra-jdbc


    【解决方案1】:

    我在这里看到您的方法存在 3 个问题,我将在下面解决这些问题:

    • 超级列族,
    • 节俭与 cql3,
    • json 数据作为单元格值。

    在继续之前:不鼓励使用超级列族Read more here。复合键(如下所述)是可行的方法。

    此外,您可能需要 read up on CQL3,因为 thrift 是自 1.2 以来的旧 API

    您可以使用native collection data types like lists, and maps etc,而不是存储json数据。如果您仍想使用 JSON,请使用 improved JSON support in in Cassandra since version 2.2

    一般来说,查询每个设备和每个时间段非常简单:

    • 行键是设备 ID,列键是 timeuuid
    • 为避免热点,您可以将“桶”计数器添加到行键(创建复合行/分区键)以轮换节点
    • 如果您知道行/设备 ID,则可以查询时间范围。

    或者,如果您想一次查询多个设备(但一种事件类型)的数据,您可以将信号类型用作行键(并将 timeuuid/timestamp 作为列键)。在 this blog entry 中阅读有关 cassandra 中时间序列数据的更多信息。

    希望有帮助!

    【讨论】:

    • 感谢omnibear,所以您建议使用复合列族主键作为设备ID,时间戳后跟一些列名,列值
    • 当我们使用 cql3 读取具有时间序列 10000 记录的单行键时,4 clumn 需要近 8 分钟,性能很慢
    • 您能否更新上述问题以反映这些最新变化?例如,您能给出您的 CQL3“创建表”语句吗?否则,很难给出有用的答案。
    • 复合行键 表示:将两个值组合成一个行/分区键,例如“deviceid”和“bucket”。 create table ..... primary key((deviceid, bucket), signaltime)。如果有多个列键(此处为:signaltime),则默认情况下所有列键都是复合列键(此处不是这种情况)。如果 oyu 有一个复合列键,那么您只能对最后一个列键运行范围查询。第一个必须使用 EQ 运算符进行查询。
    • CREATE COLUMFAMILY deviceidcomposite(did varchar,signalid varchar,lat varchar,lan varchar,timestamp varchar,PRIMARY KEY (did,timestamp))
    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 2013-07-13
    • 2014-11-18
    • 2013-06-09
    • 1970-01-01
    • 2011-01-13
    • 2016-08-29
    相关资源
    最近更新 更多