【问题标题】:Invalid DateTime error while trying to insert datetime value into BigQuery from Dataflow尝试将日期时间值从 Dataflow 插入 BigQuery 时出现无效的 DateTime 错误
【发布时间】:2018-03-15 11:34:10
【问题描述】:

我们编写了一个谷歌数据流代码,将一个值插入到一个大查询中 其列的类型为 DateTime 的表。 大多数时候逻辑运行良好。 但是突然我们遇到了 Invalid DateTime 问题。

Exception: java.lang.RuntimeException: java.io.IOException: Insert failed: [{"errors":[{"debugInfo":"generic::out_of_range: Invalid datetime string \"2017-09-26T21:16\"

目前尚不清楚上述值如何以及为何无效。 我们看到它遵循https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types中提到的 DateTime 数据类型

此外,目前尚不清楚为什么它只是偶尔抛出此错误。

我们编写了一个扩展 DoFn 的自定义转换代码 ProcessElement 代码是这样的

 public void processElement(ProcessContext c) throws Exception {

    TableRow tableRow = c.element();
    try {
       // do some processing then 
      tableRow.set("PredictedDate",**LocalDateTime.now().toString()**);
      c.output(tableRow);
    }catch(Exception exc){
        LOG.error("Exception while processing and hence not attempting to write to bigquery");
    }
} 

enter code here

它运行良好,但在夜间(美国中部时区)偶尔会失败。 你能帮我们找到根本原因吗?

【问题讨论】:

  • 字符串应该是2017-09-26T21:16:00,而不是2017-09-26T21:16

标签: google-bigquery google-cloud-dataflow


【解决方案1】:

在我的情况下,我正在检索时间戳中的时间并转换为字符串:

new Date(event_timestamp_ms).toISOString().slice(0, -1);

由于 DATETIME 不包含有关时区的信息,如果有助于从 UTC 格式中删除 Z 符号。

【讨论】:

    【解决方案2】:

    DateTime 描述的格式表示需要一个秒字段。

    YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDDDDD]]

    具体来说,请注意第二个S 没有括在方括号中,因此它是可选的。

    【讨论】:

    • 谢谢。我也在使用 LocalDateTime.now().toString() 当秒数为零时它似乎会丢弃秒数。使用 ISO 格式化程序将其设置正确。感谢您的帮助
    • 我有 7 亚秒 2018-04-22T18:15:54.9046289,使用 CONVERT(DATETIME2(6), CreatedDate) 将其降低到 6 亚秒 2018-04-22T18:15:54.904629
    • 太糟糕了,DateTimeFormat.forPattern("YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDDDDD]]") 无法处理官方的 BigQuery 模式。 java.lang.IllegalArgumentException: Illegal pattern component: T
    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2016-10-05
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2019-01-26
    相关资源
    最近更新 更多