Использование Big Query API для ввода данных в таблицу, разделенную по времени, но получение SyntaxError: неожиданный конец ввода

#python #google-api #google-bigquery

#python #google-api #google-bigquery

Вопрос:

Я пытаюсь загрузить CSV-файл в таблицу Bigquery, разделенную по месяцам.

Код возвращает следующую ошибку:

google.api_core.exceptions.BadRequest: 400 Syntax error: Expected end of input but got ":" at [17:24]

Синтаксическая ошибка, похоже, относится к двоеточию, которое является частью строки URL, которую я пытаюсь вставить в таблицу: https **: **//www.example.com

Кажется странным, что это вызовет ошибку, учитывая, что это всего лишь часть строки.

Нужно ли каким-либо образом избегать двоеточия? Если да, то как?

Мой код:

 import pandas as pd
import pandas_gbq
from google.oauth2 import service_account
from google.cloud import storage
from google.cloud import bigquery
from datetime import datetime

query =
    '''
INSERT INTO
<<project id>>.<<Dataset>>.<<table>>(_PARTITIONTIME,
url,
title,
h1
)
SELECT {},{},{},{}
'''
now = datetime.now().strftime('%Y-%m-%d')


def run():

    client = 
        storage.Client.from_service_account_json('<<path to file>>'
            )
    bq_client = 
        bigquery.Client.from_service_account_json('<<path to file>>'
            )
    bucket = client.bucket('<<bucket name>>')
    blobs = bucket.list_blobs()
    list_temp_raw = []
    for file in blobs:
        filename = file.name
        temp = pd.read_csv('gs://<<bucket name>>/'   filename)
        list_temp_raw.append(temp)
    df = pd.concat(list_temp_raw)
    df = df[cols]
    for i in range(len(df.head())):
        **load_query = query.format(
            now,
            df.loc[i, 'url'],
            df.iloc[i, 'title'],
            df.loc[i, 'h1']
            )
        query_job = bq_client.query(load_query)**
        query_job.result()
run()
 

Комментарии:

1. Попробуйте добавить круглые скобки типа SELECT {},{},{},"{}" . P.S. Лучше задать новый вопрос, потому что старый ответ сейчас не актуален. Это сбивает с толку других.

Ответ №1:

Не уверен… но, возможно, добавление МЕТКИ ВРЕМЕНИ в запрос или ожидание завершения задания может помочь:

 import pandas as pd
import pandas_gbq
from google.oauth2 import service_account
from google.cloud import storage
from google.cloud import bigquery
from datetime import datetime

query =
    '''
INSERT INTO
<<project id>>.<<Dataset>>.<<table>>(_PARTITIONTIME,
a,
b,
c,
d,
)
SELECT TIMESTAMP("{}"),{},{},{},{}
'''
now = datetime.now().strftime('%Y-%m-%d')


def run():

    client = 
        storage.Client.from_service_account_json('<<path to file>>'
            )
    bq_client = 
        bigquery.Client.from_service_account_json('<<path to file>>'
            )
    bucket = client.bucket('<<bucket name>>')
    blobs = bucket.list_blobs()
    list_temp_raw = []
    for file in blobs:
        filename = file.name
        temp = pd.read_csv('gs://<<bucket name>>/'   filename)
        list_temp_raw.append(temp)
    df = pd.concat(list_temp_raw)
    df = df[cols]
    for i in range(len(df.head())):
        load_query = query.format(
            now,
            df.loc[i, 'a'],
            df.iloc[i, 'b'],
            df.loc[i, 'c'],
            df.loc[i, 'd']
            )
        query_job = bq_client.query(load_query)
        query_job.result()  # Wait for the job to complete.
run()