to_gbq 时间戳 - InvalidSchema
Posted
技术标签:
【中文标题】to_gbq 时间戳 - InvalidSchema【英文标题】:to_gbq timestamp - InvalidSchema 【发布时间】:2018-12-05 00:20:54 【问题描述】:我正在尝试创建 pandas 数据并将其附加到 bigquery 表中。我的数据格式如下
id : asdg-123-asda-23as (字符串) 时间戳:2018-01-01T01:24:29.020Z (TIMESTAMP) 测量1:123.456(浮动) 测量3等...
我正在运行的命令是 data_frame.to_gbq(...)。我得到了错误
InvalidSchema:请验证 DataFrame 中的结构和数据类型是否与目标表的 schema 匹配。
从上一篇文章中我可以看到时间戳与字符串匹配,因此不匹配。
我应该如何格式化时间戳列? bigquery 期待什么?
我已经尝试了一些东西(例如 pd.to_datetime),但到目前为止没有运气
【问题讨论】:
看看这个问题的解决方案:***.com/questions/44953463/… - 在这里运行示例代码帮助我解决了类似的问题,方法是直接将def _generate_bq_schema
添加到我的代码中并对照表格检查结果我已经创建了。
另外,请注意,根据 Pandas 文档,您现在可以使用 table_schema
参数自己定义架构:pandas.pydata.org/pandas-docs/stable/generated/…
谢谢 Ben P。奇怪的部分(错误?)是,如果我创建一个具有定义模式的存根表,那么带有附加的 data_frame.to_gbq 会失败。但是,如果我不打扰存根,请使用 data_frame.to_gbq 创建表,然后附加相同的 data_frame.to_gbq 就可以了。架构是相同的!
嗯,是的,听起来确实很奇怪!也许旧模式被卡在某个地方的缓存中,很高兴您找到了解决方法!
你能验证两个表的模式是否相同吗?因为从您的数据格式和您所描述的内容来看,您遇到的错误似乎是由于您的表的“时间戳”字段具有 DATETIME。但是,如果您没有提前创建任何表,data_frame.to_gbq 命令将为您的“时间戳”字段创建带有 TIMESTAMP 的表。这确实与@BenP(***.com/questions/44953463/…)分享的SO案例有关
【参考方案1】:
Timestamp 列对我来说是个问题,但不完全确定原因,但删除表并通过带有表模式的 pandas-gbq 创建它对我来说是诀窍。即使架构完全符合我正在做的事情,其他任何工作都没有。
例子:
table_schema = [
"name": "column_name", "type": "STRING", "mode": "REQUIRED",
"name": "timestamp", "type": "TIMESTAMP", "mode": "REQUIRED",
]
df.to_gbq(
destination,
project_id=gcp_id,
if_exists="append",
credentials=credentials,
table_schema=table_schema,
)
注意:至于您的原始问题,我使用的是 datetime64[s] 格式,一旦通过 to_gbq 重新创建表就可以了,但在此之前就不行了
【讨论】:
以上是关于to_gbq 时间戳 - InvalidSchema的主要内容,如果未能解决你的问题,请参考以下文章
有效地将Pandas数据帧写入Google BigQuery