【问题标题】:Google Cloud function crashing when insert datetime object into BigQuery将日期时间对象插入 BigQuery 时,Google Cloud 函数崩溃
【发布时间】:2020-04-27 02:14:26
【问题描述】:

我有一个用 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 不兼容。

谁能指出我哪里出错了或者我怎样才能让它工作?

【问题讨论】:

  • 嗨@AlanSpillane 您能否编辑您的问题并添加您面临的完整错误消息?这应该有助于进一步了解您所面临的确切错误。除此之外,如果您可以编辑您之前使用的并且可以正常工作的代码,将有助于社区了解您执行的更改。
  • 你能分享你的表架构吗?
  • 函数的日志中是否有异常?
  • 我早些时候设法弄清楚这是一个问题,我在拆分后如何格式化来自 pubsub 消息的时间戳。我用下面的工作代码更新了。感谢您的所有回复。

标签: python google-bigquery google-cloud-functions google-cloud-pubsub


【解决方案1】:

我之前设法弄明白了。这是我在拆分 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 == []

【讨论】:

  • 如果您展示了print(mydatetime) 实际打印的内容,将会非常有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 2021-01-12
  • 1970-01-01
  • 2019-10-06
相关资源
最近更新 更多