Сбой функции Google Cloud при вставке объекта даты и времени в BigQuery - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть облачная функция, написанная на 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.

Может кто-нибудь указать, где я ошибаюсь или как я могу заставить это работать?

1 Ответ

0 голосов
/ 27 апреля 2020

Мне удалось выяснить это раньше. Это была проблема с тем, как я форматировал дату и время после разделения сообщения 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 == []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...