2017-03-01 170 views
2

我构建了一个定期发送MQTT消息的python脚本。AWS将MQTT消息存储到DynamoDB

这是发送给后端的JSON字符串:

{"Id": "1234", "Ut": 1488395951, "Temp": 22.86, "Rh": 48.24} 

在后端的一面,我想存储MQTT消息到DynamoDB表。

我遵循亚马逊教程,包含在MQTT消息中的数据存储在表中。

我的问题是关于表列。

表仅有3 colums:

  • 编号:分区键
  • UT:排序关键字
  • 有效载荷:包含MQTT消息。

MQTT消息中包含的每个密钥都可能有列吗?

我想有这样的列: - 标识 - UT - 温度 - 铑

感谢您的帮助!

+0

你有固定的属性或属性可以非常动态吗?在这两种情况下,都可以分别存储属性。但是,您可能需要解析json并相应地设置值。 – notionquest

+0

需要我调用解析json并将数据存储到dynamoDB的lambda函数?谢谢 – Federico

回答

1

是的,你可以。

在DynamoDB中,您不需要创建所谓的“列”。成功投放操作的唯一要求是您提供主要属性(在您的案例中IdUt)。

docs

属性名称/值对,一个用于每个属性的映射。只有 主键属性是必需的;您可以选择为该项目提供其他 属性名称 - 值对。

在Python中,你可以做一些类似的(可能需要检查语法和调整列类型):

import boto3 
client = boto3.client('dynamodb') 
response = client.put_item(
    TableName = 'Messages', 
    Item={ 
     'Id': { 
      'S': '1234' 
     }, 
     'Ut': { 
      'S': '1488395951' 
     }, 
     'Temp': { 
      'S': '22.86' 
     }, 
     'Rh': { 
      'S': '48.24' 
     } 
    } 
) 
+0

感谢您的回复。我忘了提及消息推送是由规则自动触发到AWS IoT控制台中的。我的python脚本将MQTT消息发送到AWS MQTT代理。是否可以配置此规则来分割数据? – Federico

1

是的,当然。您可以为要存储在DynamoDB表中的任何内容创建列,而不是或除了存储完整的有效内容之外。

以下步骤3.1:从this tutorial创建新项目,如果您在DynamoDB控制台看看你的表,你会更新put_item代码,包括所有项目的详细信息...

#Parse your JSON message and get out all your attributes 
id = message["Id"] 
ut = message["Ut"] 
temp = message["Temp"] 
rh = message["Rh"] 

response = table.put_item(
    Item={ 
     'id': id, 
     'ut': ut, 
     'temp': temp, 
     'rh': rh 
    } 
) 

现在,你会看到为您的其他属性创建了新列。

0

我假设您正在尝试将您的消息存储在DynamoDB表中的IoT网关规则。不幸的是,IoT规则不允许将数据存储在多个列中 - 您只能将有效负载(或其子集)存储在单个列中。目前没有规定将有效载荷中的属性提取到多个不同的列中。

解决此问题的唯一方法(我迄今为止找到的)是调用一个lambda函数,该函数的运行代码类似于其他答案显示的代码。