由于 InvalidSchema 错误,将 Pandas 上传到 BigQuery 失败
Posted
技术标签:
【中文标题】由于 InvalidSchema 错误,将 Pandas 上传到 BigQuery 失败【英文标题】:Pandas to BigQuery upload fails due to InvalidSchema error 【发布时间】:2021-07-22 19:22:58 【问题描述】:我正在使用 Pands to_gbq 将数据框附加到一个大查询表中,就像我过去使用它成功完成的那样(我只在模式中明确声明了一个字段,因此它会将其识别为日期,否则它会强制它是一个字符串):
schema = ['name': 'Week', 'type': 'DATE']
def load_to_BQ():
dataframe.to_gbq(destination_table='Table.my_table',
project_id='myprojectid',
table_schema=schema,
if_exists='append')
运行时出现以下错误:
InvalidSchema: Please verify that the structure and data types in the DataFrame match the schema of the destination table.
我很困惑,因为在使用此代码之前,我已将数据帧上传并附加到同一个 BQ 表中。我根据数据框列检查了架构,它们都匹配并且顺序正确。我怀疑罪魁祸首是数据框中称为“周”的日期字段,但即使在 BQ 中,“周”字段也被列为 DATE。我已使用以下方法将该字段转换为日期时间:
dataframe['Week'] = pd.to_datetime(dataframe['Week'], format='%m-%d-%y').dt.date
当我使用schema.generate_bq_schema(dataframe)
检查架构类型时,“周”字段返回为TIMESTAMP
。我看到有人建议使用“TIMESTAMP”作为 BQ 而不是“DATE”,但是当我在模式中更改它时,我得到了同样的错误。谁能指出我做错了什么?这是完整的错误信息:
InvalidSchema Traceback (most recent call last)
<ipython-input-117-fb947996ea53> in <module>
30 answer = input("Are you sure you want to load to BigQuery? (y/n)")
31 if answer == "y":
---> 32 load_to_BQ()
33 else:
34 print("Load failed.")
<ipython-input-117-fb947996ea53> in load_to_BQ()
12 # dataframe, table_id, job_config=job_config
13 # )
---> 14 dataframe.to_gbq(destination_table='table.my_table',
15 project_id='myprojectid',
16 table_schema=schema,
~\anaconda3\lib\site-packages\pandas\core\frame.py in to_gbq(self, destination_table, project_id, chunksize, reauth, if_exists, auth_local_webserver, table_schema, location, progress_bar, credentials)
1708 from pandas.io import gbq
1709
-> 1710 gbq.to_gbq(
1711 self,
1712 destination_table,
~\anaconda3\lib\site-packages\pandas\io\gbq.py in to_gbq(dataframe, destination_table, project_id, chunksize, reauth, if_exists, auth_local_webserver, table_schema, location, progress_bar, credentials)
209 ) -> None:
210 pandas_gbq = _try_import()
--> 211 pandas_gbq.to_gbq(
212 dataframe,
213 destination_table,
~\anaconda3\lib\site-packages\pandas_gbq\gbq.py in to_gbq(dataframe, destination_table, project_id, chunksize, reauth, if_exists, auth_local_webserver, table_schema, location, progress_bar, credentials, verbose, private_key)
1074 original_schema, table_schema
1075 ):
-> 1076 raise InvalidSchema(
1077 "Please verify that the structure and "
1078 "data types in the DataFrame match the "
InvalidSchema: Please verify that the structure and data types in the DataFrame match the schema of the destination table.
【问题讨论】:
【参考方案1】:Pandas 的数据类型与 bigquery 不同。具体来说,虽然 bigquery 支持 DATE, DATETIME, TIME, and TIMESTAMP
、pandas only supports numpy's datetime64
。有时 pandas 会以datetime64
支持您的数据,有时则不会。例如datetime64
不能存储 9999-12-31。更糟糕的是,如果单个 CSV 中的任何列都只是空值,那么 pandas 会将该列设为整数。
Pandas 不是 ETL 工具。它在很多时候都像一个鸭子类型,但它不是您尝试解决的问题类型的通用解决方案。
如果您想使用 pandas,您需要:
-
使用允许在没有 pandas 的情况下创建最终表
您可以控制数据类型(即
CREATE TABLE
DDL
statement)
使用您必须插入到临时表(过期数据集中的表或在创建表时设置表的过期时间)的代码。
使用 pandas 以外的其他工具将数据从临时表复制到最终表。 A bigquery INSERT
statement 有效。
【讨论】:
以上是关于由于 InvalidSchema 错误,将 Pandas 上传到 BigQuery 失败的主要内容,如果未能解决你的问题,请参考以下文章
报错requests.exceptions.InvalidSchema: No connection adapters were found for
尝试连接到本地主机时的 InvalidSchema [重复]
Ubuntu18.04 virutalenv报错:pip._vendor.requests.exceptions.InvalidSchema: Missing dependencies for SOC