将 RFC3339 字符串插入 bigquery 时出错

Posted

技术标签:

【中文标题】将 RFC3339 字符串插入 bigquery 时出错【英文标题】:Error inserting RFC3339 string into bigquery 【发布时间】:2020-03-30 20:39:06 【问题描述】:

我关注datetime 字符串2020-03-30T16:26:37-04:00,当我尝试将其插入bigquery(我将字符串对象作为json 对象的一部分发送)时出现错误

Invalid datetime string "2020-03-30T16:26:37-04:00" > '无效'`。

根据这篇文章,我认为格式没问题,但我仍然收到错误

What format does BigQuery timestamp take?

这是从 gcp-dataflow 管道插入到 bigquery 的 我使用的是apache-beam[gcp]==2.19.0版本

总结我在 BigQuery 中的插入方式

我从 pubsub 以字节流形式接收消息

我有一个解码器,它将字节流解码为字典列表,即["field_one":value, "field_two":value_2]

然后将此字典发送至bigquery

【问题讨论】:

澄清一下,这是从 Dataflow/Beam 作业中插入的吗?如果是,哪个 SDK 和版本? 您能否为您的问题添加更多信息?您如何尝试将此数据插入 BigQuery?你在使用数据流吗?如果是这样,您能否分享您的管道和数据样本? 用答案更新了我的问题。 正如您在此处看到的 (cloud.google.com/bigquery/docs/reference/standard-sql/…),dattime 不支持时区。您可以尝试改用时间戳吗? @EmAe 对你有用吗? 【参考方案1】:

如您所见here,DATETIME 类型不支持时区。 正确的语法是YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDDDDD]],其中:

YYYY:四位数字的年份 [M]M:一位或两位数字的月份 [D]D:一位 或两位数的日期 (|T):空格或“T”分隔符 [H]H:一 或两位数小时(有效值从 00 到 23) [M]M:一位或两位 数字分钟(有效值从 00 到 59) [S]S:一位或两位数 秒(从 00 到 59 的有效值) [.DDDDDD]:最多六个 小数位数(微秒精度)

如果您需要时区,请考虑使用TIMESTAMP。 对于TIMESTAMP,语法为YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDDDDD]][time zone],其中:

YYYY:四位数字的年份 [M]M:一位或两位数字的月份 [D]D:一位 或两位数的日期 (|T):空格或T 分隔符 [H]H:一 或两位数小时(有效值从 00 到 23) [M]M:一位或两位 数字分钟(有效值从 00 到 59) [S]S:一位或两位数 秒(从 00 到 59 的有效值) [.DDDDDD]:最多六个 小数位数(微秒精度) [时区]:字符串 代表时区。当时区未明确时 指定时,使用默认时区 UTC。查看时区 详细信息部分。

请注意,当向时间戳字段插入新值时,该值将转换为 UTC。

希望对你有帮助

【讨论】:

以上是关于将 RFC3339 字符串插入 bigquery 时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中解析/创建格式为小数秒 UTC 时区(ISO 8601、RFC 3339)的日期时间戳?

如何在 Swift 中解析/创建格式为小数秒 UTC 时区(ISO 8601、RFC 3339)的日期时间戳?

C# 对接微信支付时生成符合 RFC3339 标准的日期时间字符串

BigQuery 将 RFC 1123 日期格式字符串转换为 unixtime

ISO 8601 和 RFC 3339 日期格式有啥区别?

在 Python 中生成 RFC 3339 时间戳 [重复]