在BigQuery中插入datetime对象时,Google Cloud函数崩溃。

我有一个用Python编写的云函数,它由PubSub消息触发,基本上是将传入的消息分割开来,并将它们插入到BigQuery表中。以前,当我只是将传感器的值和用于测试的datetime.now()时间戳一起插入时,这个函数还能用。然而,由于我需要来自传感器本身的时间戳,我不得不重写函数,现在它崩溃了,我不知道问题到底出在哪里,也不知道如何进一步调试它。我的函数代码如下。

import base64
import datetime
from google.cloud import bigquery
import json


def sensor_pubsub(data, context):
    """Triggered from a message on a Cloud Pub/Sub topic.
    Args:
         event (dict): Event payload.
         context (google.cloud.functions.Context): Metadata for the event.
    """
    pubsub_message = base64.b64decode(data['data']).decode('utf-8')
    print(pubsub_message)
    accelX, accelY, accelZ, gyroX, gyroY, gyroZ, roll, pitch, yaw, ts = pubsub_message.split(", ")

    device_id = data['attributes']['deviceId']
    project_id = data['attributes']['projectId']
    registry_id = data['attributes']['deviceRegistryId']
    mytime = datetime.datetime.strptime(ts, "%H:%M:%S").time()
    mydatetime = datetime.datetime.combine(datetime.date.today(), mytime)
    client = bigquery.Client()
    dataset_id = 'sensorData'
    table_id = 'sensorTable'
    table_ref = client.dataset(dataset_id).table(table_id)
    table = client.get_table(table_ref)  # API request
    rows_to_insert = [
        (device_id, accelX, accelY, accelZ, gyroX, gyroY, gyroZ, roll, pitch, yaw, mydatetime)
    ]

    errors = client.insert_rows(table, rows_to_insert)
    assert errors == []

BigQuery表的模式都是字符串类型 除了存储时间戳的列是DATETIME格式的以外 传入的时间戳是以下格式:hh:mm:ss,这就是为什么我必须在函数本身中添加日期的原因,而且在标准的Python IDE中似乎可以工作。不知道是代码出了问题,还是时间戳的格式与BigQuery不兼容。

有谁能指出我哪里出了问题,或者我如何能让这个工作?

解决方案:

我之前设法解决了这个问题。这是一个问题,我如何格式化分割pubsub消息后的日期时间。我必须将时间戳从pubsub消息中拆分出来后转换为字符串类型,然后同样的代码就可以了(我还删除了一些我不再使用的附加传感器值)。

import base64
import datetime
from google.cloud import bigquery
import json


def sensor_pubsub(data, context):
    """Triggered from a message on a Cloud Pub/Sub topic.
    Args:
         event (dict): Event payload.
         context (google.cloud.functions.Context): Metadata for the event.
    """
    pubsub_message = base64.b64decode(data['data']).decode('utf-8')
    print(pubsub_message)
    accelX, accelY, accelZ, gyroX, gyroY, gyroZ, ts = pubsub_message.split(", ")

    device_id = data['attributes']['deviceId']
    project_id = data['attributes']['projectId']
    registry_id = data['attributes']['deviceRegistryId']
    ts1 = str(ts)
    mytime = datetime.datetime.strptime(ts1, "%H:%M:%S").time()
    mydatetime = datetime.datetime.combine(datetime.date.today(), mytime)
    print(mydatetime)
    print(type(mydatetime))
    client = bigquery.Client()
    dataset_id = 'sensorData'
    table_id = 'sensorTable'
    table_ref = client.dataset(dataset_id).table(table_id)
    table = client.get_table(table_ref)  # API request
    rows_to_insert = [
        (device_id, accelX, accelY, accelZ, gyroX, gyroY, gyroZ, mydatetime)
    ]

    errors = client.insert_rows(table, rows_to_insert)
    assert errors == []

给TA打赏
共{{data.count}}人
人已打赏
未分类

加零,使所有子集的大小相同,然后将它们相加,并在excel中显示出来

2022-9-13 15:24:38

未分类

如何在Python中对特定范围的彩票游戏进行编码?[已关闭]

2022-9-13 15:24:40

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索