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 не совпадают.

Другие вопросы по тегам