【发布时间】: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