NonePandas to gbq утверждает, что схема не совпадает, а схемы в точности совпадают. На GitHub все проблемы, как утверждается, были решены в 2017 году
Я пытаюсь добавить таблицу в другую таблицу с помощью панд, извлекая данные из BigQuery и отправляя их в другой набор данных BigQuery. Несмотря на то, что схема таблицы точно такая же, я получаю сообщение об ошибке "" Пожалуйста, проверьте, что структура и " pandas_gbq.gbq.InvalidSchema: Пожалуйста, убедитесь, что структура и типы данных в DataFrame соответствуют схеме таблицы назначения."
Эта ошибка произошла ранее, когда я пошел на перезапись таблиц, но в этом случае наборы данных слишком велики, чтобы сделать это (и это не является устойчивым решением).
df = pd.read_gbq(query, project_id="global-dashboard-146013", credentials=bigquery_key,
dialect='standard')
pd.io.gbq.to_gbq(df, dataset, projectid,
if_exists='append',
table_schema=[{'name': 'Date','type': 'STRING'},
{'name': 'profileId','type': 'STRING'},
{'name': 'Opco','type': 'STRING'},
{'name': 'country','type': 'STRING'},
{'name': 'deviceType','type': 'STRING'},
{'name': 'userType','type': 'STRING'},
{'name': 'users','type': 'INTEGER'},
{'name': 'sessions','type': 'INTEGER'},
{'name': 'bounceRate','type': 'FLOAT'},
{'name': 'sessionsPerUser','type': 'FLOAT'},
{'name': 'avgSessionDuration','type': 'FLOAT'},
{'name': 'pageviewsPerSession','type': 'FLOAT'}
],
credentials=bigquery_key)
Схема в BigQuery выглядит следующим образом:
Date STRING
profileId STRING
Opco STRING
country STRING
deviceType STRING
userType STRING
users INTEGER
sessions INTEGER
bounceRate FLOAT
sessionsPerUser FLOAT
avgSessionDuration FLOAT
pageviewsPerSession FLOAT
Затем я получаю следующую ошибку:
Traceback (последний вызов был последним): файл "..file.py", строка 63, в main()
Файл "..file.py", строка 57, в основном update_general_data(bigquery_key)
Файл "..file.py", строка 46, в update_general_data credentials=bigquery_key)
Файл "..\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pandas\io\gbq.py", строка 162, в to_gbq учетные данные = учетные данные, verbose=verbose, private_key=private_key)
Файл "..\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pandas_gbq\gbq.py", строка 1141, в to_gbq "Убедитесь, что структура и" pandas_gbq.gbq.InvalidSchema: пожалуйста убедитесь, что структура и типы данных в DataFrame соответствуют схеме таблицы назначения.
Мне кажется, что есть матч 1 на 1. Я видел, что другие потоки говорят об этом, и эти потоки в основном говорят о форматах даты, хотя формат даты уже является строкой в этом случае и затем с table_schema все еще сделан как строка.
4 ответа
Окончательное решение этой проблемы заключается в том, чтобы вместо ручного указания схемы, которая всегда может быть подвержена ошибкам приведения/именования типов, всегда лучше всего получить схему из самой таблицы. Итак, клиент использует последнюю версию API:
from google.cloud import bigquery
from google.oauth2 import service_account
credentials = service_account.Credentials.from_service_account_file(
'credentials.json')
project_id = 'your_project_id',
client = bigquery.Client(credentials= credentials,project=project_id)
Получите таблицу, которую вы хотите записать/добавить:
table = client.get_table('your_dataset.your_table')
table
Сгенерируйте схему из таблицы:
generated_schema = [{'name':i.name, 'type':i.field_type} for i in table.schema]
generated_schema
Переименуйте свой фрейм данных соответственно:
data.columns = [i.name for i in table.schema]
Передайте ту же схему при отправке ее в BigQuery:
data.to_gbq(project_id = 'your_project_id',
destination_table = 'your_dataset.your_table',
credentials = service_account.Credentials.from_service_account_file(
'credentials.json'),
table_schema = generated_schema,
progress_bar = True,
if_exists = 'replace')
У меня были серьезные проблемы с этим, и я исправил это, получив
pandas-gbq
чтобы создать базу данных, а не делать это в пользовательском интерфейсе и пытаться сопоставить схему
У меня был столбец в моем фрейме данных под названием «Нет». Удаление периода устранило проблему, и схема была выведена.
Скорее всего, проблема возникает из-за того, что имена столбцов в DataFrame и Schema не совпадают.