将 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 标准的日期时间字符串