pandas到gbq声称模式不匹配,而模式是完全相同的,在github上,所有问题都声称在2017年得到了解决

bqujaahr  于 2023-03-11  发布在  Git
关注(0)|答案(4)|浏览(136)

我尝试通过panda将一个表追加到另一个表,从BigQuery中提取数据并将其发送到另一个BigQuery数据集。虽然表架构完全相同,但我收到错误“请验证结构和“panda_gbq.gbq.InvalidSchema:请验证DataFrame中的结构和数据类型是否与目标表的架构匹配。”
这个错误发生在早些时候,我去覆盖表,但在这种情况下,数据集太大,这样做(这不是一个可持续的解决方案)。

df = pd.read_gbq(query, project_id="my-project", 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 (most recent call last):   File "..file.py", line 63, in
<module>
    main()
  File "..file.py", line 57, in main
    updating_general_data(bigquery_key)
  File "..file.py", line 46, in updating_general_data
    credentials=bigquery_key)
  File
"..\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pandas\io\gbq.py",
line 162, in to_gbq
    credentials=credentials, verbose=verbose, private_key=private_key)
  File
"..\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pandas_gbq\gbq.py",
line 1141, in to_gbq
     "Please verify that the structure and " pandas_gbq.gbq.InvalidSchema: Please verify that the structure and
data types in the DataFrame match the schema of the destination table.

在我看来,这似乎是一个1对1的匹配,我看到其他线程讨论这个问题,这些线程主要讨论日期格式,即使日期格式已经是一个字符串在这种情况下,然后与表_模式仍然作为字符串.

brtdzjyr

brtdzjyr1#

最终的“解决方案”是手动指定模式,而不是手动指定模式,因为手动指定模式总是容易出现类型转换/命名错误。最好总是从表中获取模式。因此,客户端使用最新版本的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

相应地重命名 Dataframe :

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')
chhkpiq4

chhkpiq42#

我在这方面遇到了真实的的问题,通过使用pandas-gbq创建数据库(而不是在UI中创建数据库)并尝试匹配模式来修复它

nwo49xxi

nwo49xxi3#

我的 Dataframe 中有一列名为“No”。删除句点就解决了这个问题,并且可以推断出模式。

zwghvu4y

zwghvu4y4#

出现此问题的原因很可能是DataFrame和Schema中的列名不匹配

相关问题