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的主要内容,如果未能解决你的问题,请参考以下文章

to_gbq() 得到了一个意外的关键字参数“位置”

Pandas gbq 加载 - to_gbq 超时异常

有效地将Pandas数据帧写入Google BigQuery

Pandas 到 GBQ 方法返回 GenericGBQException:原因 404 POST

拒绝 BigQuery 对现有数据的数据加载尝试

Google Big Query 的奇怪活动