У меня есть облачная функция, написанная на 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 имеют тип String, за исключением столбца для хранения метки времени в формате DATETIME. Метка входящего времени имеет следующий формат: чч: мм: сс, поэтому мне пришлось добавить дату в саму функцию и, похоже, она работает в стандартной Python IDE. Не уверен, что это что-то не так с кодом или формат отметки времени несовместим с BigQuery.
Может кто-нибудь указать, где я ошибаюсь или как я могу заставить это работать?