Amazon web services 通过IoT核心规则传递时间戳时,数据未插入到Timestream表中(通过SQL time\u to\u epoch)

Amazon web services 通过IoT核心规则传递时间戳时,数据未插入到Timestream表中(通过SQL time\u to\u epoch),amazon-web-services,aws-iot,aws-iot-core,amazon-timestream,Amazon Web Services,Aws Iot,Aws Iot Core,Amazon Timestream,假设传感器发送如下数据: {"timestamp": "2020-11-11 08:27:19", "temperature": 90, "device": "device1"} 创建IoT核心规则以将数据发送到Timestream db表 规则SQL:从“主题”中选择设备、温度、时间到纪元(时间戳'yyyy-MM-dd HH:MM:ss')作为fn 尺寸:设备 值:${device} 时

假设传感器发送如下数据:

{"timestamp": "2020-11-11 08:27:19", "temperature": 90, "device": "device1"}
  • 创建IoT核心规则以将数据发送到Timestream db表

  • 规则SQL:
    从“主题”中选择设备、温度、时间到纪元(时间戳'yyyy-MM-dd HH:MM:ss')作为fn

  • 尺寸:
    设备

    值:
    ${device}

  • 时间戳:
    ${fn\u ts}

    单位:
    毫秒

  • 此数据未到达Timestream db。但是,如果删除步骤4中设置的时间戳字段,则数据将到达Timestream db会有什么问题?

    令人惊讶的是,如果我将步骤2的输出重新发布到一个新主题,并创建一个规则,将该主题中的消息发送到Timestream db,其配置与上述步骤3和步骤4相同,那么数据将进入Timestream db


    另外,如果原始消息是
    {“fn_ts”:1605083835000,“temperature”:90,“device”:“device1”}
    ,并且我有一个规则,使用相同的步骤3和步骤4将数据发送到Timestream db,那么数据将到达Timestream表。

    我只是浪费了2天时间来处理IoT规则直接输入Timestream。我只能确认,这是因为它似乎从一开始的马车。使用自定义时间戳的唯一方法是执行您建议的变通方法,例如在单独的规则中转换有效负载并重定向到另一个物联网主题。因为出于某种原因,injestion操作看不到SQL生成的JSON中的字段,我可以清楚地诊断它,因为我附加了一个CloudWatch操作来查看我试图使用SQL生成的每个有效负载



    但还有一个大问题。当您最终设法将数据输入到表中时,您会发现每个有效负载字段都是表中一个单独的度量字段,甚至时间戳本身和所有已标记为dimensoins的字段也是如此。那太好了。在我浪费了这么多时间之后,我仍然需要继续使用自定义lambda来避免表中所有这些混乱的度量。

    我只是浪费了2天时间来处理IoT规则对时间流的直接影响。我只能确认,这是因为它似乎从一开始的马车。使用自定义时间戳的唯一方法是执行您建议的变通方法,例如在单独的规则中转换有效负载并重定向到另一个物联网主题。因为出于某种原因,injestion操作看不到SQL生成的JSON中的字段,我可以清楚地诊断它,因为我附加了一个CloudWatch操作来查看我试图使用SQL生成的每个有效负载



    但还有一个大问题。当您最终设法将数据输入到表中时,您会发现每个有效负载字段都是表中一个单独的度量字段,甚至时间戳本身和所有已标记为dimensoins的字段也是如此。那太好了。在我浪费了这么多时间之后,我仍然需要继续使用自定义lambda来避免表中所有这些混乱的度量。

    根据AWS IoT规则,当使用引用SQL AS子句中定义的别名的替换模板时,它将无法按预期工作

    从:

    由于替换模板中的表达式是与“SELECT…”语句分开计算的,因此不能引用使用AS子句创建的别名。您只能引用原始有效负载、功能和运算符中的信息

    因此,对于您的有效载荷:

    {"timestamp": "2020-11-11 08:27:19", "temperature": 90, "device": "device1"}
    
    如果将SQL更改为以下内容:

    SELECT * FROM 'topic'
    
    您仍然可以像以前一样设置维度和设备,但您可以这样设置时间戳:

    ${time_to_epoch(时间戳,'yyyy-MM-dd HH:MM:ss')}


    这将使用您的时间戳调用time_to_epoch函数,并将结果值用作时间流中的时间戳。

    根据AWS IoT规则,当您使用引用SQL as子句中定义的别名的替换模板时,它将无法按预期工作

    从:

    由于替换模板中的表达式是与“SELECT…”语句分开计算的,因此不能引用使用AS子句创建的别名。您只能引用原始有效负载、功能和运算符中的信息

    因此,对于您的有效载荷:

    {"timestamp": "2020-11-11 08:27:19", "temperature": 90, "device": "device1"}
    
    如果将SQL更改为以下内容:

    SELECT * FROM 'topic'
    
    您仍然可以像以前一样设置维度和设备,但您可以这样设置时间戳:

    ${time_to_epoch(时间戳,'yyyy-MM-dd HH:MM:ss')}

    这将使用您的时间戳调用time_to_epoch函数,并将结果值用作时间流中的时间戳