首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Apache Cassandra数据建模

Apache Cassandra数据建模
EN

Stack Overflow用户
提问于 2018-01-06 14:03:41
回答 1查看 154关注 0票数 0

我需要一些帮助的数据模型,以保存智能表数据,我非常新的工作与卡桑德拉。

必须存储的数据:

这是一个1智能表的例子:

{"logical_name":"smgw_123",

"ldevs":

[{"logical_name":"sm_1",“对象”:{"capture_time":390600,“单位”:30,“标量”:-3,“状态”:"000",“值”:152.361925},

{"logical_name":"sm_2",“对象”:{"capture_time":390601,“单位”:33,“标量”:-3,“状态”:"000",“值”:0.3208547253907171},

{"logical_name":"sm_3",“对象”:{"capture_time":390602,“单位”:36,“标量”:-3,“状态”:"000",“值”:162.636025}]

}

这是1智能仪表网关和logical_name "smgw_123“。

ldevs数组中,3智能仪表,并描述了它们的值。

因此,智能仪表网关与3台智能电表有关。智能仪表又有了自己的数据。

问题

我不知道如何将这些数据存储在无sql数据库中(在我的例子中是cassandra)中,这些数据有关联。

我必须使用两个以上的列吗?类似于智能仪表网关(逻辑名称、智能meter1、智能仪表2、智能仪表3)

另一个带有智能表(逻辑名称、捕获时间、单位、定标器、状态、值)

???

另一个问题是,所有智能电表网关都可以有不同数量的智能仪表。

我希望我能描述我的问题可以理解。

thx

EN

回答 1

Stack Overflow用户

发布于 2018-01-09 11:32:11

在Cassandra数据建模中,首先要做的是确定查询。您将根据查询对表的分区键和群集列进行建模。

在您的示例中,我假设您将根据智能仪表网关的逻辑名称查询它们。我是说,你的问题看起来就像

代码语言:javascript
运行
复制
select <some_columns> 
from smart_meter_gateway 
where smg_logical_name = <a_smg_logical_name>;

此外,我假设每个智能仪表网关逻辑名称都是唯一的,而ldevs数组中的每个智能表名称都有一个唯一的逻辑名称。

如果是这样的话,您应该创建一个包含smg_logical_name分区键列和sm_logical_name集群列的表。通过这样做,您将创建一个表,其中每个智能仪表网关分区将包含一定数量的智能仪表:

代码语言:javascript
运行
复制
 create table smart_meter_gateway 
 (
     smg_logical_name text,
     sm_logical_name text,
     capture_time int,
     unit int,
     scaler int,
     status text,
     value decimal,
     primary key ((smg_logical_name), sm_logical_name)
);

您可以使用以下语句插入此表:

代码语言:javascript
运行
复制
insert into smart_meter_gateway (smg_logical_name, sm_logical_name, capture_time, unit, scaler, status, value)
values ('smgw_123', 'sm_1', 390600, 30, -3, '000', 152.361925);

insert into smart_meter_gateway (smg_logical_name, sm_logical_name, capture_time, unit, scaler, status, value)
values ('smgw_123', 'sm_2', 390601, 33, -3, '000', 0.3208547253907171);

insert into smart_meter_gateway (smg_logical_name, sm_logical_name, capture_time, unit, scaler, status, value)
values ('smgw_123', 'sm_3', 390602, 36, -3, '000', 162.636025);

当您通过smart_meter_gateway查询smg_logical_name表时,您将在结果集中得到3行:

代码语言:javascript
运行
复制
select * from smart_meter_gateway where smg_logical_name = 'smgw_123';

此查询的结果是:

代码语言:javascript
运行
复制
smg_logical_name    sm_logical_name     capture_time    scaler  status  unit    value
smgw_123            sm_1                390600          -3      000     30      152.361925
smgw_123            sm_2                390601          -3      000     33      0.3208547253907171
smgw_123            sm_3                390602          -3      000     36      162.636025

还可以将sm_name作为筛选器添加到查询中:

代码语言:javascript
运行
复制
select * 
from smart_meter_gateway 
where smg_logical_name = 'smgw_123' and sm_logical_name = 'sm_1';

这一次,您将在结果集中只得到1行:

代码语言:javascript
运行
复制
smg_logical_name    sm_logical_name     capture_time    scaler  status  unit    value
smgw_123            sm_1                390600          -3      000     30      152.361925

请注意,还有其他方法可以对数据进行建模。例如,可以为ldevs数组使用集合列,这种方法有一些优点和缺点。正如我在一开始所说的,它取决于您的查询需求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48128122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档